web-dev-qa-db-ja.com

Jacksonを使用してオーバーロードされたメソッドでJSONをオブジェクトにデシリアライズする

Jacksonを使用して、CouchDbに保存されているJSONオブジェクトをデシリアライズしようとしています。このオブジェクトは、オーバーロードされたメソッドを含むpojoに逆シリアル化する必要があります。 Couchからオブジェクトを取得しようとして逆シリアル化を行うと、次の例外が発生します。

org.ektorp.DbAccessException:org.codehaus.jackson.map.JsonMappingException:プロパティ「multiplier」の競合するセッター定義:com.db.commodities.framework.sdos.model.security.EqOpt#setMultiplier(1 params)vs com.db .commodities.framework.sdos.model.security.EqOpt#setMultiplier(1 params)

ジャクソンに使いたいセッターに注釈を付けようとしましたが、うまくいかなかったようです。

@JsonProperty("multiplier")
public void setMultiplier(SDOSAttribute multiplier) {
     this.multiplier = multiplier;
}

public void setMultiplier(double multiplier) {
     this.multiplier.setValue(String.valueOf(multiplier));
}

特定の方法を使用して正しくデシリアライズするようにジャクソンを構成するにはどうすればよいですか?それとも、この問題に間違った方法でアプローチしていますか?

編集:

次の変更を加えました。これは動作するように見えますが、少しいです。誰かがこれを行うためのより良い方法を持っている場合は、気軽に共有してください、私は喜んで受け入れます。

@JsonProperty("multiplier")
protected void setMultiplierAttribute(SDOSAttribute multiplier) {
    this.multiplier = multiplier;
}

@JsonIgnore
public void setMultiplier(double multiplier) {
    this.multiplier.setValue(String.valueOf(multiplier));
}
52
gregwhitaker

あいまいさを避けるために、セッターメソッドの名前を変更する必要はありません。それ以外の場合は、@JsonIgnoreで正しい軌道に乗っています。無視するすべての同じ名前のメソッドで@JsonIgnoreを使用すると、使用するメソッドに@JsonProperty注釈は必要ありません。

この点を示す簡単な例を次に示します。

input.json:{"value":"forty-two"}

Foo.Java:

import Java.io.File;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  String value;

  public String getValue() {return value;}
  public void setValue(String value) {this.value = value;}

  @JsonIgnore
  public void setValue(int value) {this.value = String.valueOf(value);}

  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    Foo foo = mapper.readValue(new File("input.json"), Foo.class);
    System.out.println(mapper.writeValueAsString(foo));
  }
}

Jacksonアノテーションを使用して初期のPOJO defsを変更したくない場合は、MixInを使用できます。

import Java.io.File;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  String value;

  public String getValue() {return value;}
  public void setValue(String value) {this.value = value;}
  public void setValue(int value) {this.value = String.valueOf(value);}

  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class);
    Foo foo = mapper.readValue(new File("input.json"), Foo.class);
    System.out.println(mapper.writeValueAsString(foo));
  }
}

abstract class IgnoreFooSetValueIntMixIn
{
  @JsonIgnore public abstract void setValue(int value);
}
49

Jackson> 2.4では、直接使用します。

mapper.addMixIn(Foo.class, IgnoreFooSetValueIntMixIn.class);
6
gribo

@JsonIgnoreが役に立たない場合(現在そのようなケースはありますが、理由はまだわかりません)、代わりに@XmlTransientを使用することもできます。

2
lilalinux