Android开发Android知识

moshi-JSON解析库的使用

2017-02-15  本文已影响987人  水瓶鱼

简介

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

使用

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);

例如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在序列化和反序列化时就会跳过这个字段。

上一篇下一篇

猜你喜欢

热点阅读