zoukankan      html  css  js  c++  java
  • 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序列化结果,反序列也是如此。

  • 相关阅读:
    springboot启动后执行某些动作
    Virtualbox的nat网络
    xshell6
    day01 K8S
    Nginx的日志文件切割
    virtualbox磁盘空间大小调整
    装修柜子木台面
    mybatis 批量in 多个字段写法
    jenkins shell常用配置
    activiti工作流引擎数据库表结构
  • 原文地址:https://www.cnblogs.com/myhalo/p/6723381.html
Copyright © 2011-2022 走看看