2016-11-17 2 views
1

問題があります。私はビルダーパターンをデシリアライズするためにjackson jsonの例を使用しましたが、私はいつも空のjsonを取得します。 私はjackson-databindバージョン2.8.4を使用しています 何か不足していますか? だから私のコードは次のとおりです。ビルダーパターンjson deserialize

バリュークラス

import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 

@JsonDeserialize(builder=ValueBuilder.class) 
public class Value { 
    private final int x, y; 
    protected Value(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

ValueBuilderクラス

import com.fasterxml.jackson.annotation.JsonCreator; 

//@JsonPOJOBuilder(buildMethodName = "build", withPrefix = "with") 
public class ValueBuilder { 
    private int x; 
    private int y; 

    // can use @JsonCreator to use non-default ctor, inject values etc 
    public ValueBuilder() { } 

    // if name is "withXxx", works as is: otherwise use @JsonProperty("x") or @JsonSetter("x")! 
public ValueBuilder withX(int x) { 
    this.x = x; 
    return this; // or, construct new instance, return that 
} 
public ValueBuilder withY(int y) { 
    this.y = y; 
    return this; 
} 
@JsonCreator 
public Value build() { 
    return new Value(x, y); 
    } 
} 

スタートクラス

public class Start { 
    public static void main(String[] args) throws IOException { 
     Value newValue = new ValueBuilder().withX(2).withY(4).build(); 
     ObjectMapper mapper = new ObjectMapper(); 
     String jsonString = mapper.writeValueAsString(newValue); 
     System.out.println(jsonString); 
    } 
} 
+0

なぜこれが下降しているのか分かりません... – Mena

+0

デシリアライザは.readValueで使用されます。*シリアライザが必要な.writeValue *を呼び出しています。 – NateN

答えて

0

あなただけのためにアクセスできるゲッターが欠落していますのxとクラス - ObjectMapperは、シリアル化するためにアクセスする必要があります。

は、あなたのValueクラス定義に次の行を追加していない:

public int getX() { 
    return x; 
} 
public int getY() { 
    return y; 
} 

この文脈では、追加の注釈の必要はあります。

あなたのJSONは次のようにプリントアウトされます:あなたはまた同じ結果に到達するためにフィールドpublicを作ることができ、それが適切なカプセル化を汚すでしょう

{"x":2,"y":4} 

+0

しかし、ビルダーパターンのアプローチは、価値クラスのセッターを持つことではありませんか?そのため、jackson libには2.xバージョン以降、ビルドパターンのサポートが "@JsonDeserialize(builder = ValueBuilder.class)"であるか、ビルダークラスで "setters"と "with"以外のプレフィックスビルダーに「@JsonPOJOBuilder(buildMethodName = "build"、withPrefix = "set")」というアノテーションを付ける必要があります。 – MultiShinigami30

+0

これで動作します。両方の方法で、シリアライズとデシリアライズを行います。 Valueクラスにgetterを追加しました。ビルダークラスでいくつかのアノテーションを行いました。私のユースケースはいくつかの属性を持つことでした。これは任意であり、xは常に必要であり、yはオプションです。したがって、private @JsonProperty( "y")int y;ビルダーコンストラクタでは:public ValueBuilder(@JsonProperty( "x")int x){this.x = x; }また、xの作成と設定時にxが常に必要になるため、xのBuilder設定メソッドを削除しました。 ObjectMapperの場合:mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES、false); – MultiShinigami30

関連する問題