【发布时间】:2021-07-13 18:53:55
【问题描述】:
我有一个像这样的 json 字符串:
{
"name": "abc",
"type": "type1",
"artist": {
"name": "ally"
},
"other_part": "{\"id\":\"ee50abd7\",\"metadata\":"...\"}"
}
如您所见,“other_part”看起来像宽松的格式。它用引号表示。
在这里,我只想将它转换为 POJO 类。但是 other_part 给出了解析错误。任何建议。
POJO 类:
class Data
{
private String name;
private String type;
private Artist artist;
private Other other_part;
...getters
}
class Artist
{
private String name;
...getters
}
class Other
{
private String id;
private String metadata;
...getters
}
和休息模板:
restTemplate.exchange(requestEntity, Data.class);
错误:
(尽管至少存在一个 Creator):没有 String-argument 构造函数/工厂方法可以从 String 值反序列化...
谢谢大家解决了 JsonDeserialize:
public static class OtherConverter extends StdConverter<String, Other>
{
@Override
public Other convert(String value)
{
return new Gson().fromJson(value, Other.class);
}
}
class Data
{
private String name;
private String type;
private Artist artist;
@JsonDeserialize( converter = OtherConverter.class )
private Other other_part;
...getters
}
【问题讨论】:
-
你为什么要把 Jackson 和 Gson 混在一起?
-
@fluffy 感谢您的评论。是的,最好摆脱其中之一。有没有更好的解决方案的建议?
-
当然。 Gson 有
@JsonAdapter注释。可以将类型适配器工厂绑定到注解中,类型适配器工厂应该做到以下几点: 1)在create方法中使用gson.getDelegateAdapter(this, typeToken)获取原始类型适配器工厂; 2) 返回一个新类型适配器,其read方法使用nextString()方法从JsonReader读取字符串,并通过调用其fromJson(String)方法重载将字符串委托给委托适配器。就是这样。
标签: java spring-boot gson resttemplate