2017-10-10 149 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

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

相關問題