美文网首页Android开发Android知识
moshi-JSON解析库的使用

moshi-JSON解析库的使用

作者: 水瓶鱼 | 来源:发表于2017-02-15 18:05 被阅读987次

    简介

    moshi是square开源的JSON解析库,square出品必属精品,moshi确实解决了不少问题,使用起来也比较简单,方便。

    使用

    • 解析JSON字符串到java Object,Object序列化

        //反序列化
        Moshi moshi=new Moshi.BUilder().build();
        JsonAdapter<Obj> jsonAdapter=moshi.adapter(Obj.class);
        Obj obj=jsonAdapter.fromJson(json);
        
        //序列化
        Obj obj=new Obj();
        Moshi moshi=new Moshi.Builder().build();
        JsonAdapter<Obj>=jsonAdapter=moshi.adapter(Obj.class);
        String json=jsonAdapter.tojson(obj);
      
    • JSON 类和java类属性名不一致时,使用注解

        @Json(name="XXX")
      
    • 自定义的数据类型

    moshi支持java基本类型和对应的包装类型,String,list,map还有Enum
    对于有些不支持的数据类型,可以自定义adapter进行类型转换。ex:

        /**
        *对Date类型进行解析
        */
        public class DateAdapter{
            @ToJson String toJson(Date date){
            return DateUtil.dateToStr(date);
            }
            @FromJson Date fromJson(String json){
            return DateUtil.strToDate(json);
            }
        }
        //序列化
        Moshi moshi=new Moshi.Builder()
            .add(new DateAdapter())
            .build();
        Type type = Types.newParameterizedType(List.class, MemberInfo.class);
        JsonAdapter<List<MemberInfo>> jssonAdapter=moshi.adapter(type);
        String result=jssonAdapter.toJson(copy);
    
    • moshi还支持类型转换

    例如android中经常用的color:
    json字符串:

        {
        "width": 1024,
        "height": 768,
        "color": "#ff0000"
        }
    

    java中的实体类

        class Rectangle {
        int width;
        int height;
        int color;
        }
    

    因为json中的color字段对应的是字符串,而java中的color是int,直接反序列化,程序会抛出异常。moshi 可以使用下面的方法解决这个问题。

        @Retention(RUNTIME)
        @JsonQualifier
        public @interface HexColor {
        }
        /** Converts strings like #ff0000 to the corresponding color ints. */
        class ColorAdapter {
        @ToJson String toJson(@HexColor int rgb) {
        return String.format("#%06x", rgb);
        }
    
        @FromJson @HexColor int fromJson(String rgb) {
        return Integer.parseInt(rgb.substring(1), 16);
        }
        }
    

    给字段加上标识:
    class Rectangle {
    int width;
    int height;
    @HexColor int color;
    }

    • 跳过某个字段

    对于一些不需要序列化和反序列化的字段可以使用 transient 关键字标注,这样moshi在序列化和反序列化时就会跳过这个字段。

    相关文章

      网友评论

        本文标题:moshi-JSON解析库的使用

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