Jackson Deserialiser:在现场使用@JsonCreator 和@JsonProperty?
Jackson Deserialiser : use @JsonCreator AND @JsonProperty on field?
我正在尝试将一些 Json 解析为 Java 对象。
有些字段需要自定义行为,所以我尝试在构造函数上使用 @JsonCreator
。
好吧,它可以工作,但是对于其他字段 @JsonProperty
注释没有填充。
还没有检查,但我想我的对象用 @JsonUnwrapped
注释也没有填充。
在我的搜索中,我看到一条评论表明这是可能的,但我不知道如何实现。
json 中大约有 400 个字段,只有 5 或 6 个需要自定义行为。因此,如果我可以避免重写所有构造函数......那会很好!
我尝试过的例子:
public class MyObjectA {
@JsonProperty("keyField1")
private String myField1;
@JsonUnwrapped
private MyObjectB;
private String[] myField2;
@JsonCreator
public MyObjectA(final Map<String, Object> properties){
myField2 = ... //some Business logic
}
}
联合 :
ObjectMapper mapper = new ObjectMapper();
MyObjectA result = mapper.readValue(getJsonInputStream(JSON_FILE_PATH),MyObjectA.class);
Assert.notNull(result.getMyField1(),"should be populated")
Assert.notNull(result.getMyField2(),"should be populated")
Assert.notNull(result.getMyObjectB(),"should be populated")
注意:没有构造函数,其他字段填充得很好
在这里。查看注释和未注释 @JsonConstructor
用法之间的区别。我正在处理 属性 一些自定义处理,并使用 setName 来调用名称。希望有帮助
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
public class Jackson2 {
public static void main(String[] args) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final String jsonInString = "{\"name\":\"hello world\",\"something\":\"from string\"}";
System.out.println(jsonInString);
Foo newFoo = mapper.readValue(jsonInString, Foo.class);
System.out.println(newFoo.getName());
System.out.println(newFoo.getSomething());
}
}
class Foo {
@JsonProperty
private String name;
private String something;
public String getSomething() {
return something;
}
public void setSomething(String something) {
this.something = something;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Foo() {
}
// @JsonCreator
public Foo(final Map<String, Object> properties) {
System.out.println("printing.."+properties);
something = "Something from constructor";
}
@JsonCreator
public Foo(@JsonProperty("something") String something ) {
System.out.println("printing.."+name);
this.something = "Something from constructor appended"+something;
}
}
所以想法是在构造函数参数中使用 @JsonProperty 来获取要自定义的属性。 :)
我正在尝试将一些 Json 解析为 Java 对象。
有些字段需要自定义行为,所以我尝试在构造函数上使用 @JsonCreator
。
好吧,它可以工作,但是对于其他字段 @JsonProperty
注释没有填充。
还没有检查,但我想我的对象用 @JsonUnwrapped
注释也没有填充。
在我的搜索中,我看到一条评论表明这是可能的,但我不知道如何实现。
json 中大约有 400 个字段,只有 5 或 6 个需要自定义行为。因此,如果我可以避免重写所有构造函数......那会很好!
我尝试过的例子:
public class MyObjectA {
@JsonProperty("keyField1")
private String myField1;
@JsonUnwrapped
private MyObjectB;
private String[] myField2;
@JsonCreator
public MyObjectA(final Map<String, Object> properties){
myField2 = ... //some Business logic
}
}
联合 :
ObjectMapper mapper = new ObjectMapper();
MyObjectA result = mapper.readValue(getJsonInputStream(JSON_FILE_PATH),MyObjectA.class);
Assert.notNull(result.getMyField1(),"should be populated")
Assert.notNull(result.getMyField2(),"should be populated")
Assert.notNull(result.getMyObjectB(),"should be populated")
注意:没有构造函数,其他字段填充得很好
在这里。查看注释和未注释 @JsonConstructor
用法之间的区别。我正在处理 属性 一些自定义处理,并使用 setName 来调用名称。希望有帮助
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
public class Jackson2 {
public static void main(String[] args) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
final String jsonInString = "{\"name\":\"hello world\",\"something\":\"from string\"}";
System.out.println(jsonInString);
Foo newFoo = mapper.readValue(jsonInString, Foo.class);
System.out.println(newFoo.getName());
System.out.println(newFoo.getSomething());
}
}
class Foo {
@JsonProperty
private String name;
private String something;
public String getSomething() {
return something;
}
public void setSomething(String something) {
this.something = something;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Foo() {
}
// @JsonCreator
public Foo(final Map<String, Object> properties) {
System.out.println("printing.."+properties);
something = "Something from constructor";
}
@JsonCreator
public Foo(@JsonProperty("something") String something ) {
System.out.println("printing.."+name);
this.something = "Something from constructor appended"+something;
}
}
所以想法是在构造函数参数中使用 @JsonProperty 来获取要自定义的属性。 :)