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



我正在使用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 并编写一个生成所需对象的转换器类,但我希望避免这种情况。

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

public class Foo {
private String a;
private B b;
// getters setters
}
public class B {
private String c;
private String d;
// getters setters
}

应该映射没有其他注释与代码。如果你有一个带有非平凡示例的特定代码,那么请完整发布您的实际代码。

更新您的澄清:不,正如我在评论中所说,你不能用注释来做到这一点。您必须编写自定义反序列化程序。看看这个答案:杰克逊:是否可以将父对象的属性包含在嵌套对象中?

如果你不想编写呈现JSON结构的java bean,你必须使用不同的库。Jackson 强制你创建一个反映 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 对象。

最新更新