【问题标题】:Complex Json Mapping in Spring with RestTemplate在 Spring 中使用 RestTemplate 进行复杂的 Json 映射
【发布时间】:2021-04-01 22:20:33
【问题描述】:

我正在尝试将 jsonResponse 映射到我的 Java 实体类。 json 响应如下所示

   "classResults":{
      "classSuggestion":[
          "classA",
          {
            "section":"section c"
          }
      ]
    }
    

我的用于映射的 Java 类可能看起来像这样。我将有一个 ClassSuggestion 对象以映射 classSuggestion 对象。但是 classSuggestion 将如何保存上述 json 数据?

public class ClassResults {

   ClassSuggestion classSuggestion

}

我的 ClassSuggestion 会怎样?

public class ClassSuggestion {

   String classes
   String section
}

如何将其映射到 Java 类或数据类型?

【问题讨论】:

  • 那么,简而言之,你想要一个联合类型?是否可以将"classA" 包装在类似于{ "section":"section c" } 的对象中(您是否可以控制JSON API)?可以有多少个字符串和section 对象?
  • 我无法控制由不同团队拥有的 JSON API。我能够使用自定义反序列化器进行反序列化,我最初为了方便而试图避免使用它。

标签: java json spring resttemplate


【解决方案1】:
@Data // lombok
public class ClassResults {
   private List<ClassSuggestion> classSuggestion; // mapped from array
}

@Data
@NoArgsConstructor
public class ClassSuggestion {
   private String classes;
   private String section;
   public ClassSuggestion(String classes) {
     this.classes = classes; //Handle string "classA"
   }
}

【讨论】:

    【解决方案2】:

    我通过编写自定义反序列化器解决了这个问题:

    class ClassSuggestionDeserializer extends StdDeserializer<Employee> {
    
       @Override
       public Map<String, String> deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
          ObjectCodec codec = jp.getCodec();
          TreeNode node = codec.readTree(jp);
          JsonNode classResults = node.get("classResults");
          // and finally iterating through the classResults to get string values
       }
    }
    

    同时在数据类上,使用了自定义反序列化器的JsonDeserialize。

    @JsonDeserialize(using=ClassSuggestionDeserializer.class)
    public class ClassSuggestion {
    
       Map<String, String> classResults;
    
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2012-04-16
      • 2018-04-26
      • 2019-08-29
      • 2019-07-06
      相关资源
      最近更新 更多