我正在使用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
此库使用JSONObject
和JSONArray
通用对象,将 json 的内容映射到 java 对象。