5

Jackson 1.9.1 を使用して、JSON 要求応答文字列を Java オブジェクトとの間でシリアライズおよびデシリアライズします。プリミティブ Java 型、コレクション型、およびカスタム オブジェクトは、問題なく (非) シリアル化されます。ただし、JSON 文字列を Java 列挙型にデシリアライズしようとすると問題が発生します。JSON 文字列は次のようにシリアル化されます。

"wt":{"wt":100.5,"unit":{"LBS":3}}

wt の Java タイプは次のようになります。

public class Weight {

    protected double weight;
    protected Unit unit;
}

SO でthisthis、およびthisを参照し、次のような重量単位の列挙型を思い付きました。

public enum Unit {

    KG("kg"),
    GM("gm"),
    LBS("lbs"),
    OZ("oz");

    private String value;  
    private WeightMeasurementUnit(String value) { this.value = value; }

    @JsonValue
    public String getValue() { return this.value; }

    @JsonCreator
    public static Unit create(String val) {
        Unit[] units = Unit.values();
        for (Unit unit : units) {
            if (unit.getValue().equals(val)) {
                return unit;
            }
        }
        return LBS;
    }
}

問題は、上記の JSON を逆シリアル化しようとすると、「認識されないフィールド "LBS" (Class abcdWeight)、無視できるものとしてマークされていない」というエラーが表示されることです。

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "LBS" (Class a.b.c.d.Weight), not marked as ignorable
 at [Source: java.io.ByteArrayInputStream@20172017; line: 1, column: 464] (through reference chain: a.b.c.d.MyRequest["blah"]->a.b.c.d.AnotherType["wt"]->a.b.c.d.Weight["LBS"])
    at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
    at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)

...

私の質問は次のとおりです: enum のシリアル化された JSON 文字列は正しいようですか? 列挙型を適切に逆シリアル化するには、他に何を含める (または注釈を付ける) 必要がありますか?

4

2 に答える 2

6

public enum Unitコードブロックでは、代わりUnitWeightMeasurementUnit.

Weightクラスには a と a しかないのでweight、 aは値のない単なる単位であるため、unitを渡す{"wt":100.5,"unit":"lbs"}と機能するはずです。unitそのため、デシリアライザーが{"LBS":3}として解析する方法はありませんUnit。は何の3ためですか?

別の問題は、「LBS」を渡しているのに値が「lbs」であることです。したがって、標準化する必要があるか、使用する必要がありますunit.getValue().equalsIgnoreCase(val)

于 2013-08-29T08:32:25.377 に答える