• Android使用Gson(相当于C#的Newtonsoft.Json)非常好用


    C#转Java有一段时间了,之前做ASP.NET WebAPI微软竟将第三方类库Newtonsoft.Json作为VS新建MVC和WebAPI项目默认必备的Json工具Nuget包,可想而知这个包有多受宠。

    现在Newtonsoft.Json的最新版本已经出到v10.0.2了,而Java则是谷歌的开源Json工具包:Gson,目前最新版本是v2.8.0,最新他和Newtonsoft.Json的原理一样,也是使用反射来实现的。

    如果要在Android Studio使用非常简单,先在AndroidManifest.xml添加

    compile 'com.google.code.gson:gson:2.8.0'

    然后Android Studio就会提示你gradle文件已经更改过了,需要同步,点击上方黄色提示框右边的Sync Now然后等一会就可以尽情的使用了。

    那如何使用它呢?我这里有一个复杂一点的Json,先看这段Json;

    {
        "data": [
            {
                "Avatar": "/Image/avatar0.jpg",
                "Id": 0,
                "IsDelete": true,
                "Name": "旋风小伙0"
            },
            {
                "Avatar": "/Image/avatar1.jpg",
                "Id": 1,
                "IsDelete": true,
                "Name": "旋风小伙1"
            },
            {
                "Avatar": "/Image/avatar2.jpg",
                "Id": 2,
                "IsDelete": true,
                "Name": "旋风小伙2"
            }
        ],
        "result": {
            "code": 1,
            "msg": "Ok"
        }
    }
    

      分析这段Json,Java的对象模型大概是这样的:

    对了,如果你想在Android Studio快速生成Setter和Getter方法,只需要在当前类使用Alt+Insert快捷键选择你想快速生成的代码类型即可

    用户信息的模型:UserInfo

    public class UserInfo {
        private int Id;
        private String Name;
        private String Avatar;
        private boolean IsDelete;

    ...Setter和Getter方法 }

    返回状态代码的模型:BaseResult

    public class BaseResult {
        private int code;
        private String msg;
    ...Setter和Getter方法
    }

    Result-Data模型

    public class DataResult {
        private BaseResult result;
        private List<UserInfo> data;
    ...Setter和Getter方法
    }

    生成模型后我们就要开始实例化对象,打开MainActicity.java在onCreate方法添加如下代码:

            DataResult model = new DataResult();
    
            List<UserInfo> users = new ArrayList<>();
            //使用for循环添加UserInfo
            for (int i = 0;i < 3;i++){
                UserInfo user = new UserInfo();
                user.setAvatar("/Image/avatar" + i + ".jpg");
                user.setId(i);
                user.setName("旋风小伙" + i);
                user.setDelete(true);
                users.add(user);
            }
    
            BaseResult result = new BaseResult();
            result.setCode(1);
            result.setMsg("Ok");
    
            model.setData(users);
            model.setResult(result);

    最后,要用到我们强大的Gson类了,在这里Newtonsoft.Json和Gson的使用有点不同,Newtonsoft.Json序列化和反序列化的方法是静态的,而Gson则不是,这里我们封装一个JsonUitl为了以后方便静态调用使用:

    我们新建一个JsonUtil类:

    1,定义一个静态私有变量mGson,并将它实例化;

    2,定义一个静态方法ToObject,将json反序列转化成指定对象,这个方法只有一行代码,其实就是调用了Gson的fromJson方法,将一段json和要转换的目标传进去,他就会以什么类型返回;

    2,定义一个静态方法ToJson,将对象序列化转化成Json,这个方法也是调用了Gson的ToJson方法将对象转换成一段Json返回String类型;

    import com.google.gson.Gson;
    
    
    /**
     * Created by Administrator on 2017/4/17.
     */
    
    public class JsonUtil {
    
        private static Gson mGson = new Gson();
    
        public static Object toObject(String json , Class classOfT){
            return  mGson.fromJson(json , classOfT) ;
        }
    
        public static <T> String toJson(T object) {
            return mGson.toJson(object);
        }
    }

    这样就好了,我们只需要一行代码就可以把上面的model对象转换成Json对象了。

    String jsonData = JsonUtil.toJson(model);
    Log.d("Test", jsonData);
    

     运行模拟器,查看Android Monitor序列化结果,反序列也是如此。

  • 相关阅读:
    单例模式
    HashSet、LinkedHashSet、SortedSet、TreeSet
    ArrayList、LinkedList、CopyOnWriteArrayList
    HashMap、Hashtable、LinkedHashMap
    andrew ng machine learning week8 非监督学习
    andrew ng machine learning week7 支持向量机
    andrew ng machine learning week6 机器学习算法理论
    andrew ng machine learning week5 神经网络
    andrew ng machine learning week4 神经网络
    vue组件监听属性变化watch方法报[Vue warn]: Method "watch" has type "object" in the component definition. Did you reference the function correctly?
  • 原文地址:https://www.cnblogs.com/myhalo/p/6723381.html
走看看 - 开发者的网上家园