【问题标题】:Convert JSON String (Which includes different lenients) to Java Class with RestTemplate使用 RestTemplate 将 JSON 字符串(包括不同的 lenients)转换为 Java 类
【发布时间】: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


【解决方案1】:

您是否尝试为类提供 Setter 和空构造函数,以便序列化 Jackson(spring 中的默认数据序列化器),据我所知需要这个。

【讨论】:

    【解决方案2】:

    似乎 other_part 只是一个字符串值而不是 JSON 对象。

    如果无法更改输入,那么我建议您为 otherPart 字段创建自定义设置器/解析器:

    @JsonProperty("other_part")
    private void unpackOtherPart(String otherPart) {
       // create Other from otherPart string
    }
    

    【讨论】:

      【解决方案3】:

      您可能需要创建一个自定义反序列化器。

         @JsonDeserialize(using = CustomDateDeserializer.class) 
         private Other other_part;
      

      在自定义序列化程序中,您将收到字符串信息。 然后,您可以使用选择的库来转换此字符串。

      示例: https://www.tutorialspoint.com/jackson_annotations/jackson_annotations_jsondeserialize.htm

      【讨论】:

      • OP 要求的是 Gson 解决方案,而不是 Jackson 解决方案。
      • 感谢 edubriguenti,你给了我关于解决方案的灵感。用 JsonDeserialize 解决,但不是用 StdConverter 解决 StdDeserializer。
      猜你喜欢
      • 2017-08-21
      • 2023-04-01
      • 1970-01-01
      • 2020-12-01
      • 2017-10-09
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多