将JSON字符串与新的POJO对象匹配

时间:2017-07-05 06:32:39

标签: java json jackson

我正在使用Spring RestTemplate与提供的JSON提供的REST服务进行通信。要映射我正在使用Jaxon的响应,但我很乐意切换到其他任何有效的方法。

我想创建一个包含已传递数据的子内容但在不同结构中的POJO。

归结为:

资料来源:{ "a": "val_a", "b" : {"c" : "val_c", "d": "val_d"}}

@JsonIgnoreProperties(ignoreUnknown = true)
class Foo {
   // should contains the content of `"a": "val_a"`
   // but contains null
   private Baa;

   // getter and setter
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Baa {
  private String a;

  // getter and setter
}


// This should be the operation that is done internally by Spring when calling 
// ResponseEntity<Foo>response = restTemplate.exchange(url, HttpMethod.GET, entity, Foo.class);
// response.getBody();
private Foo read(String s) {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(Include.NON_NULL);
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    return mapper.readValue(s, Foo.class);
}    

反序列化的结果是一个空的Baa对象。实际的JSON和POJO对象结构更复杂,但总结起来。

任何实现这一目标的技术都会受到欢迎。 我想出的唯一可能性是在提供的结构中反序列化JSON并编写一个生成所需Object的Converter类,但我希望避免这种情况。

-----更新/澄清------ 问题是,属性a应该在类Baa中映射,它位于Foo中但是在提供的JSON objekt的根路径(这是正确的术语?)中提供

2 个答案:

答案 0 :(得分:1)

public class Foo {

  private String a;
  private B b;

  // getters setters

}

public class B {

  private String c;
  private String d;

  // getters setters

}

应该在您的代码中没有附加注释的情况下进行映射。如果你有一个特殊的代码与一个非常重要的例子然后发布您的实际代码。

更新您的澄清:如我在评论中所说的那样,你不能用注释做到这一点。您必须编写自定义反序列化器。看看这个答案:Jackson: is it possible to include property of parent object into nested object?

答案 1 :(得分:0)

如果您不想编写支持JSON结构的java bean,则必须使用不同的库。杰克逊强迫你创建一个反映JSON结构的java结构。在我看来杰克逊工作得很好,我建议你使用它,但替代方案可能是JSON库。

使用此选项,您只能从json中选择所需的元素,并将其映射到所需的bean。

小例子:

JSONObject response =  new JSONObject("{\"a\": \"val_a\", \"b\" : {\"c\" : \"val_c\", \"d\": \"val_d\"}}");

JSONObject bObject =  response.getJSONObject("b");
String cElement = (String) elenco.get("c");

bObject 的值为{"d":"val_d","c":"val_c"} cElement 的值为val_c

此库使用JSONObjectJSONArray个通用对象,将json的内容映射到java对象。