moshi-JSON解析库的使用

简介

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

使用

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

      //反序列化
      Moshi moshi=new Moshi.BUilder().build();
      JsonAdapter jsonAdapter=moshi.adapter(Obj.class);
      Obj obj=jsonAdapter.fromJson(json);
      
      //序列化
      Obj obj=new Obj();
      Moshi moshi=new Moshi.Builder().build();
      JsonAdapter=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> 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解析库的使用)