Java 如何使用@JsonProperty注释访问JSON子字段?
我需要在另一个不同的json中转换json,我使用@JsonProperty注释更改名称字段json结果,但我不知道访问字段封装在不同的json级别,例如:Java 如何使用@JsonProperty注释访问JSON子字段?,java,json,jackson,Java,Json,Jackson,我需要在另一个不同的json中转换json,我使用@JsonProperty注释更改名称字段json结果,但我不知道访问字段封装在不同的json级别,例如: { "prop1" : "value1", "prop2" : "value2", "prop3" : { "prop4" : "value4", "prop5" : { "prop6" : "value6" } } } json结果 { "prop1_new
{ "prop1" : "value1",
"prop2" : "value2",
"prop3" : {
"prop4" : "value4",
"prop5" : {
"prop6" : "value6"
}
}
}
json结果
{
"prop1_new_name":"value1",
"prop4_new_name":"value4",
"prop6_new_name":"value6"
}
反序列化时,“prop3”将是Java对象中的映射(如果您对其进行了正确的注释)。然后可以创建自定义JsonSerializer以输出预期结果
要创建自定义JsonSerializer,您可以按照以下指南进行操作:这看起来像是以前的JsonSerializer的延续。因此,除了使用答案中解释的
@JsonUnwrapped
之外,还需要在声明它的类的字段中添加@JsonProperty
。使用@JsonProperty
修改上一个答案会得到以下结果:
@RunWith(JUnit4.class)
public class Sample {
@Test
public void testName() throws Exception {
SampleClass sample = new SampleClass("value1", "value2", new SubClass("value4", "value5", new SubSubClass("value7")));
new ObjectMapper().writeValue(System.out, sample);
}
@JsonAutoDetect(fieldVisibility=Visibility.ANY)
public static class SampleClass {
private String prop1;
private String prop2;
@JsonUnwrapped
private SubClass prop3;
public SampleClass(String prop1, String prop2, SubClass prop3) {
this.prop1 = prop1;
this.prop2 = prop2;
this.prop3 = prop3;
}
}
@JsonAutoDetect(fieldVisibility=Visibility.ANY)
public static class SubClass {
@JsonProperty("prop4_new_name")
private String prop4;
private String prop5;
@JsonUnwrapped
private SubSubClass prop6;
public SubClass(String prop4, String prop5, SubSubClass prop6) {
this.prop4 = prop4;
this.prop5 = prop5;
this.prop6 = prop6;
}
}
@JsonAutoDetect(fieldVisibility=Visibility.ANY)
public static class SubSubClass{
@JsonProperty("prop7_new_name")
private String prop7;
public SubSubClass(String prop7) {
this.prop7 = prop7;
}
}
}
因此:
{"prop2":"value2","prop5":"value5","prop7_new_name":"value7","prop4_new_name":"value4","prop1_new_name":"value1"}
虽然您可以使用
@JsonUnwrapped
进行一定程度的扁平化,但也许您应该重新考虑方法本身:为什么您的POJO与JSON如此不同?他们一定要这么做吗?数据绑定是为两个匹配的情况而设计的——如果不匹配,单独的转换通常工作得更好。