2017-10-10 161 views
2

我想解析一些Json到一个Java对象。
某些字段需要自定义行为,所以我试图在构造函数上使用@JsonCreatorJackson反序列化器:在字段中使用@JsonCreator和@JsonProperty?

那么,它的工作,但其他字段与@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 

    } 

} 

的Junit:

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") 

注:无构造,其他的领域中是公填充

+0

请分享您的代码与问题...与示例json和您的pojo – Optional

+0

文章编辑,以提供一个示例。 –

回答

1

这。查看注释与非注释@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构造函数的参数为​​要自定义属性。 :)

+0

哦,我明白了! :) 工作正常,谢谢。 –

相关问题