簡體   English   中英

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 。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM