Kotlin的Gson解析(反序列化)

作者: 微风细雨007 | 来源:发表于2018-04-22 12:05 被阅读302次

    更新

    Kotlin List和 MutableList 差异:可读写性

    在使用JSON To Kotlin Class 插件,版本号v1.7.3时。
    解析的集合为Kotlin的List,因为在Kotlin中,List为只读的,要想读写需要使用MutableList。
    我在更新Adapter的时候发现的,明明数据有变化,显示却一直不变,原因就在这!!!


    正文

    同样的写法,在java中使用fastjson,gson到kotlin怎么就不灵了=。=!!!

    Gson

    序号 api 作用
    1 toJson(Object) 序列化
    2 fromJson(String, Class) 反序列化
    3 JsonParser().parse(String) 解析字段

    实体类生成工具

    像Java中的GsonFormat,Kotlin中也有插件JsonToKotlinClass

    JsonToKotlinClass

    代码示例

    1. 加入依赖

       //json解析
        api 'com.google.code.gson:gson:2.8.2'
    

    2.创造数据

     val data = """{
      "error": false,
      "results": [
        {
          "_id": "5aa5cc6a421aa9103ed33c7c",
          "createdAt": "2018-03-12T08:40:10.360Z",
          "desc": "3-12",
          "publishedAt": "2018-03-12T08:44:50.326Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "https://ws1.sinaimg.cn/large/610dc034ly1fp9qm6nv50j20u00miacg.jpg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a8e0c41421aa9133298a259",
          "createdAt": "2018-02-22T08:18:09.547Z",
          "desc": "2-22",
          "publishedAt": "2018-02-22T08:24:35.209Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "https://ws1.sinaimg.cn/large/610dc034ly1foowtrkpvkj20sg0izdkx.jpg",
          "used": true,
          "who": "\u4ee3\u7801\u5bb6"
        },
        {
          "_id": "5a7b93d2421aa90d2cd3d7f8",
          "createdAt": "2018-02-08T08:03:30.905Z",
          "desc": "2-8",
          "publishedAt": "2018-02-08T08:13:24.479Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180208080314_FhzuAJ_Screenshot.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a6e5f88421aa9115696004f",
          "createdAt": "2018-01-29T07:40:56.269Z",
          "desc": "1-29",
          "publishedAt": "2018-01-29T07:53:57.676Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180129074038_O3ydq4_Screenshot.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a65381a421aa91156960022",
          "createdAt": "2018-01-22T09:02:18.715Z",
          "desc": "1-22",
          "publishedAt": "2018-01-23T08:46:45.132Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180122090204_A4hNiG_Screenshot.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a5bfc29421aa9115489927b",
          "createdAt": "2018-01-15T08:56:09.429Z",
          "desc": "1-15",
          "publishedAt": "2018-01-16T08:40:08.101Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180115085556_8AeReR_taeyeon_ss_15_1_2018_7_58_51_833.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a5411fb421aa90fef2035f3",
          "createdAt": "2018-01-09T08:51:07.91Z",
          "desc": "1-9",
          "publishedAt": "2018-01-10T07:57:19.486Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180109085038_4A7atU_rakukoo_9_1_2018_8_50_25_276.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a443fcb421aa90fe72536ed",
          "createdAt": "2017-12-28T08:50:19.747Z",
          "desc": "12-28",
          "publishedAt": "2018-01-04T13:45:57.211Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20171228085004_5yEHju_Screenshot.jpeg",
          "used": true,
          "who": "\u4ee3\u7801\u5bb6"
        },
        {
          "_id": "5a4ad432421aa90fe2f02d1a",
          "createdAt": "2018-01-02T08:37:06.235Z",
          "desc": "1-2",
          "publishedAt": "2018-01-02T08:43:32.216Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20180102083655_3t4ytm_Screenshot.jpeg",
          "used": true,
          "who": "daimajia"
        },
        {
          "_id": "5a431acd421aa90fe50c02a8",
          "createdAt": "2017-12-27T12:00:13.664Z",
          "desc": "12-27",
          "publishedAt": "2017-12-27T12:13:22.418Z",
          "source": "chrome",
          "type": "\u798f\u5229",
          "url": "http://7xi8d6.com1.z0.glb.clouddn.com/20171227115959_lmlLZ3_Screenshot.jpeg",
          "used": true,
          "who": "daimajia"
        }
      ]
    }"""
    

    3.创建实体类(使用JsonToKotlinClass工具)

    data class ResultBean(
            val error: Boolean,
            val results: List<MeiZiBean>
    )
    
    data class MeiZiBean(
            val _id: String,
            val createdAt: String,
            val desc: String,
            val publishedAt: String,
            val source: String,
            val type: String,
            val url: String,
            val used: Boolean,
            val who: String
    )
    

    4.解析

            //注意必须是javaObjectType,要不会被擦除泛型
            val bean = Gson().fromJson(data, ResultBean::class.javaObjectType)
            val results = bean.results
            //验证是否有数据
            val s = results.toString()
            Log.e("main",s)
    

    遇到的坑

    之前一直写的是ResultBean::class.java,导致被泛型擦除,只能先解析成字符串,然后专门用TypeToken解析List,非常麻烦,网上看了很多文章也没有解决,最后还得自己发现。

    示例代码


    源码注释

    /**
     * This is the main class for using Gson. Gson is typically used by first constructing a
     * Gson instance and then invoking {@link #toJson(Object)} or {@link #fromJson(String, Class)}
     * methods on it. Gson instances are Thread-safe so you can reuse them freely across multiple
     * threads.
     *
     * <p>You can create a Gson instance by invoking {@code new Gson()} if the default configuration
     * is all you need. You can also use {@link GsonBuilder} to build a Gson instance with various
     * configuration options such as versioning support, pretty printing, custom
     * {@link JsonSerializer}s, {@link JsonDeserializer}s, and {@link InstanceCreator}s.</p>
     *
     * <p>Here is an example of how Gson is used for a simple Class:
     *
     * <pre>
     * Gson gson = new Gson(); // Or use new GsonBuilder().create();
     * MyType target = new MyType();
     * String json = gson.toJson(target); // serializes target to Json
     * MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2
     * </pre></p>
     *
     * <p>If the object that your are serializing/deserializing is a {@code ParameterizedType}
     * (i.e. contains at least one type parameter and may be an array) then you must use the
     * {@link #toJson(Object, Type)} or {@link #fromJson(String, Type)} method.  Here is an
     * example for serializing and deserializing a {@code ParameterizedType}:
     *
     * <pre>
     * Type listType = new TypeToken&lt;List&lt;String&gt;&gt;() {}.getType();
     * List&lt;String&gt; target = new LinkedList&lt;String&gt;();
     * target.add("blah");
     *
     * Gson gson = new Gson();
     * String json = gson.toJson(target, listType);
     * List&lt;String&gt; target2 = gson.fromJson(json, listType);
     * </pre></p>
     *
     * <p>See the <a href="https://sites.google.com/site/gson/gson-user-guide">Gson User Guide</a>
     * for a more complete set of examples.</p>
     *
     * @see com.google.gson.reflect.TypeToken
     *
     * @author Inderjeet Singh
     * @author Joel Leitch
     * @author Jesse Wilson
     */
    

    相关文章

      网友评论

      本文标题:Kotlin的Gson解析(反序列化)

      本文链接:https://www.haomeiwen.com/subject/rkiqlftx.html