0

次のような JSONObject があります。

  {
   "name": "John",
   "details": [
      [
       "phone",
       123456789
      ],
      [
       "address",
       "abcdef"
      ]
   ]
}

上記のjSONを次のオブジェクトにマップしようとしています:

 @JsonIgnoreProperties(ignoreUnknown = true)
 public class Employee{
       String name;
       List<List<DetailItem>> details;


       public String getName() {
       return name;
       }
       public void setName(String name) {
      this.name = name;
       }
       public List<List<DetailItem>> getDetails() {
      return details;
       }
       public void setDetails(List<List<DetailItem>> details) {
      this.details = details;
       }

    }


     @JsonSubTypes({
       @JsonSubTypes.Type(value=String.class),
       @JsonSubTypes.Type(value=Integer.class)
       })
    public class DetailItem{

    }

以下を使用したマッピング:

     ObjectMapper mapper = new ObjectMapper();
     mapper.readValue(instream, Employee.class)

例外:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, DetailItem] from String value; no single-String constructor/factory method (through reference chain: Employe["details"])

ポリモーフィック デシリアライゼーションをそのまま実行しようとしていますDetailItemStringInteger

ありがとう

4

1 に答える 1

1

これは、ポリモーフィック デシリアライゼーションの仕組みではありません。ポリモーフィズムとは何かという定義そのものを無視し、関係のないクラス間の関係を魔法のように作成しようとしています。明示的に強制されていなくても、注釈が付けられた型@JsonSubTypesは、定義された各 s の親クラスである必要があります@Type

@JsonSubTypes({
    @Type(value=String.class), // String is not a subclass of DetailItem!
    @Type(value=Integer.class) // Integer is not a subclass of DetailItem!
})
public class DetailItem{
}

根本的な問題は、非常に粗雑に設計された JSON 入力です。detail各プロパティが非正規化されて別々の配列に格納された理由を尋ねるつもりはありませんが、形式をより適切なものに修正することを強くお勧めします。例えば:

{
    "name": "John",
    "details": {
        "phone" : 123456789,
        "address" : "abcedf",
    }
}

上記は、次のオブジェクトに簡単に逆シリアル化できます。

class Employee {
    private Sting name;
    private Map<String, Object> details;

    // constructor, getters/setters
}

現在の形式に固執している場合は、に変更するかList<List<DetailItem>>List<List<Object>>カスタムデシリアライザーを実装してください。

于 2013-05-10T22:13:38.057 に答える