使用RestTemplate将JSON字符串(包括不同的长度)转换为Java类
我有一个json字符串,如:使用RestTemplate将JSON字符串(包括不同的长度)转换为Java类,java,spring-boot,gson,resttemplate,Java,Spring Boot,Gson,Resttemplate,我有一个json字符串,如: { "name": "abc", "type": "type1", "artist": { "name": "ally" }, "other_part": "{\"id\":\"ee50abd7\",\"m
{
"name": "abc",
"type": "type1",
"artist": {
"name": "ally"
},
"other_part": "{\"id\":\"ee50abd7\",\"metadata\":"...\"}"
}
就像你看到的,“其他部分”看起来像是宽大的格式。它用引号表示
在这里,我只想将其转换为POJO类。但另一部分给出了解析错误。任何建议
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:
restTemplate.exchange(requestEntity, Data.class);
错误:
(尽管至少存在一个创建者):没有要从字符串值反序列化的字符串参数构造函数/工厂方法
感谢大家用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
}
公共静态类OtherConverter扩展StdConverter
{
@凌驾
公共其他转换(字符串值)
{
返回新的Gson().fromJson(值,Other.class);
}
}
类数据
{
私有字符串名称;
私有字符串类型;
私人艺术家;
@JsonDeserialize(converter=OtherConverter.class)
私人或其他部分;
…获得者
}
您是否尝试为类提供setter和空构造函数,以便序列化Jackson(spring中的默认数据序列化程序),根据我所知,您是否需要此构造函数。另一部分似乎只是字符串值,而不是JSON对象
如果无法更改输入,我建议您为otherPart字段创建自定义setter/parser:
@JsonProperty("other_part")
private void unpackOtherPart(String otherPart) {
// create Other from otherPart string
}
您可能需要创建一个自定义反序列化程序
@JsonDeserialize(using = CustomDateDeserializer.class)
private Other other_part;
在自定义序列化程序中,您将收到字符串信息。
然后可以使用所选库转换此字符串
例如:
OP要求的是Gson解决方案,而不是Jackson解决方案。谢谢Edubliguenti,你给了我解决方案的灵感。用JsonDeserialize解决了问题,但没有用StdConverter解决STDESerializer。你为什么要混合Jackson和Gson?@fluffy谢谢你的评论。是的,最好是摆脱其中一个。有没有更好的解决方案的建议?当然有。Gson有
@JsonAdapter
注释。您可以将类型适配器工厂绑定到注释中,类型适配器工厂应执行以下操作:1)使用gson.getDelegateAdapter(this,typeToken)
中的创建方法获取原始类型适配器工厂;2) 返回一个新类型适配器,其read
方法使用nextString()
方法从JsonReader
读取字符串,并通过调用其fromJson(string)
方法重载将字符串委托给委托适配器。就这样。