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