12

Jacksonを使用してJSONをJavaPOJOに逆シリアル化しようとしています。機密情報を提供せずに、ObjectMapperの逆シリアル化が失敗した場合のスタックトレースの例を次に示します。

org.codehaus.jackson.map.JsonMappingException: Can not construct Map key of type com.example.MyEnum from String "coins": not a valid representation: Can not construct Map key of type com.example.MyEnum from String "coins": not one of values for Enum class

私のJSONは次のようになります:

"foo": {
    "coins": null,
    ...
}

そして、私が逆シリアル化したいクラスには、次のフィールドがあります。

private Map<MyEnum, MyPojo> foo;

そして私の列挙型は次のようになります:

public enum MyEnum {
    COINS("coins"),
    ...
}

null値を逆シリアル化しようとしていることに気づきました。しかし、これはまだ機能するはずです。逆シリアル化の結果は、foo.put(MyEnum.COINS, null)実際に有効なJava命令であるMapを使用した場合と同等になるはずです。よろしくお願いします。

4

3 に答える 3

10

提示された1つの優れたソリューション(ファクトリメソッド)に加えて、他に2つの方法があります。

  • 'MyEnum.toString()'が "coins"を返す場合、Jacksonに "name()"ではなく "toString()"を使用させることができます。ObjectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
  • 使用するIDを返す他のメソッドを追加し、そのメソッドに@JsonValueアノテーションを付けることができます(上記の機能を有効にする代わりに、実際にそれを使用することもできtoString()ます)-そのアノテーションが存在する場合、そのメソッドによって返された値がid。
于 2012-11-16T00:53:19.663 に答える
9

GRR!理解した。

私にとっての解決策は@JsonCreator、Stringパラメーターに基づいて列挙型のインスタンスを作成する静的メソッドを列挙型に作成することでした。それはこのように見えました:

@JsonCreator
public static MyEnum create(String str) {
    // code to return an enum based on the String parameter
}
于 2012-11-15T22:06:57.910 に答える
6

文字列によって列挙型を構築し、@JsonCreatorで注釈を付ける静的ファクトリメソッドを列挙型クラスに提供します。

@JsonCreator
public static MyEnum fromValue(String v) {
    for (MyEnum myEnum : values()) {
        if (myEnum.text.equals(v)) {
            return myEnum;
        }
    }
    throw new IllegalArgumentException("invalid string value passed: " + v);
}
于 2012-11-15T22:11:40.893 に答える