Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RestTemplate将JSON字符串(包括不同的长度)转换为Java类_Java_Spring Boot_Gson_Resttemplate - Fatal编程技术网

使用RestTemplate将JSON字符串(包括不同的长度)转换为Java类

使用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

我有一个json字符串,如:

{
   "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)
方法重载将字符串委托给委托适配器。就这样。