jackson的使用案例
jackson核心对象 —— objectMapper
objectMapper是将object和json进行互转的核心类
json转object —— readValue方法
readValue可以有两个参数,其中参数1是从哪读,可以是file、流、url等,参数2是解析成什么类型。readValue有各种重写类型,其中最常用为:
readValue(String, Class);将String的json串解析为对应的Class;此处使用自己构建的Dto解析json也可以。
也可以通过核心抽象组装类型TypeReference<T>进行组装类的转化,例如:
readValue(String, new TypeReference<List<String>>() {});此处需要注意,想从str中解析出list,必须序列化的时候也拿list来序列化,直接拿str来序列化是不可能解析成长度为1的list的
一般来说,把对象进行序列化和反序列化最合适。
object转json —— writeValue方法
如果object是JsonNode类型可以直接读,不一定要转。
return object instanceof JsonNode ? object.toString() : om.writeValueAsString(object);否则可以使用writeValue方法转成想要的类型。
writeValue有多种入参的版本,还有writeValueAsString、writeValueAsBytes方法
jackson源码赏析
jackson使用过程中的一些知识点
反序列化复杂嵌套对象
假如有一个对象是List<ComplexObj>转化的jsonString
将其反序列化时可使用:JSON.parseObject(jsonString, new TypeReference<Result<AddressQueryResult>>() {})
如果ComplexObj里面还有List<T> subList,而T还可能是一个List<InnerComplexObj>这样里面的类型就拿不到,导致反序列化不了
这时,可在jsonString里面加@type属性,例如:
[{\"subList\": [{\"type1\":....}, {\"type2\":...}]}]可变成:
[{\"subList\": [{\"@type\": \"com.me.InnerComplexObj\",\"type1\":....}, {\"@type\": \"com.me.InnerComplexObj\",\"type2\":...}]}]
即在实际真实属性前面加额外的@type属性,让json解析出来
评论区