2

オブジェクトをjsonとして取得するために、外部Webサービスを呼び出しています。このオブジェクトにはプロパティ「value」があり、これは文字列である場合と文字列の配列である場合があります。

public class MyClass {

    // ... other variables

    private String value;

    public String getValue() {
        return value;
    }

    @JsonProperty("value")
    public void setValue(String value) {
        this.value = value;
    }
}

現在、org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY tokenこのフィールドについて不平を言うエラーが表示されます。value誰かが私のクラスで定義する正しい方法が何であるかについてのヒントを私に与えることができるかどうか疑問に思いました。

これは私が扱わなければならないサンプルjsonの一部です:

    {
      "id": 12016907001,
      "type": "Create",
      "value": "normal",
      "field_name": "priority"
    },
    {
      "id": 12016907011,
      "type": "Create",
      "value": [
        "sample",
        "another"
      ],
      "field_name": "tags"
    }

ありがとう。

- 編集

値のタイプをObjectに変更したところ、問題は解決しました。しかし、私はまだこのケースを処理するためのより良い方法があるかどうか疑問に思っています。

4

3 に答える 3

8

簡単なハックは、DeserializationFeature#ACCEPT_SINGLE_VALUE_AS_ARRAYを有効にしてから、ダニエルの答えを使用することです。Webサービスが文字列を返す場合、Jacksonはそれを単一要素のコレクションに変換します。

編集:

この機能を使用するためにJackson1.8以降にアップグレードできない場合は、次のようにすることができます。

private Collection<String> value;

public Collection<String> getValue() {
    return value;
}

public void setValue(Object value) {
    if (value instanceof Collection) {
        this.value = (Collection<String>) value;
    } else {
        this.value = Arrays.asList((String) value);
    }
}
于 2013-03-26T13:54:18.233 に答える
0

値は配列であるため、文字列に変換できません。

あなたはJavaクラスである必要があります次のようなものでなければなりません:

class MyClass
{
   public int id;
   public String type;
   public Collection<String> value;
   public String field_name;
}

たとえば、パブリックフィールドを使用しています(これは正常に機能します)。

于 2013-03-25T23:28:21.793 に答える
0

値のタイプとしてJsonNodeを使用できます。isArray()その後、 (または)の戻り値に応じて値を処理できますisValueNode()。JsonNodesは、これらの単純なチェックを超えた幅広い機能を提供するため、生のJSONを処理するための最も便利な方法だと思います。

if (value.isArray()) {

    // process your array

} else {

    // process your string

}
于 2013-03-26T09:20:20.823 に答える