0

このJSONをPOJOに取り込むのに問題があります。私は次のように構成されたジャクソンを使用しています:

protected ThreadLocal<ObjectMapper> jparser = new ThreadLocal<ObjectMapper>();

    public void receive(Object object) {
    try { 
        if (object instanceof String && ((String)object).length() != 0) {
            ObjectDefinition t = null ; 
            if (parserChoice==0) { 
                if (jparser.get()==null) {
                    jparser.set(new ObjectMapper());
                }
                t = jparser.get().readValue((String)object, ObjectDefinition.class);
            }

            Object key = t.getKey();
            if (key == null)
                return;
            transaction.put(key,t); 
        } 
    } catch (Exception e) { 
        e.printStackTrace();
    }
}

POJOに変換する必要があるJSONは次のとおりです。

{
    "id":"exampleID1",
    "entities":{
      "tags":[
         {
            "text":"textexample1",
            "indices":[
               2,
               14
            ]
         },
         {
            "text":"textexample2",
            "indices":[
               31,
               36
            ]
         },
         {
            "text":"textexample3",
            "indices":[
               37,
               43
            ]
         }
      ]
}

そして最後に、これが私が現在javaクラスのために持っているものです:

    protected Entities entities;
@JsonIgnoreProperties(ignoreUnknown = true)
protected class Entities {
    public Entities() {}
    protected Tags tags;
    @JsonIgnoreProperties(ignoreUnknown = true)
    protected class Tags {
        public Tags() {}

        protected String text;

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }
    };

    public Tags getTags() {
        return tags;
    }
    public void setTags(Tags tags) {
        this.tags = tags;
    }
};
//Getters & Setters ...

より単純なオブジェクトをPOJOに変換することはできましたが、リストに困惑しています。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4

あなたの問題はクラス定義にあると思います。Tagsクラスに、配列である Json からの生のテキストが含まれていることを望んでいるようです。代わりに何をしますか:

protected Entities entities;
@JsonIgnoreProperties(ignoreUnknown = true)
protected class Entities {
    public Entities() {}
    @JsonDeserialize(contentAs=Tag.class)
    protected List<Tag> tags;

    @JsonIgnoreProperties(ignoreUnknown = true)
    protected class Tag {
        public Tag() {}

        protected String text;

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }
    };

    public Tags getTags() {
        return tags;
    }
    public void setTags(Tags tags) {
        this.tags = tags;
    }
};

ここでは、フィールド タグで List を使用して Json 配列を表し、Jackson にそのリストのコンテンツを Tag クラスとして逆シリアル化するように指示します。これは、Jackson がジェネリック宣言の実行時情報を持っていないために必要です。インデックスについても同じことを行います。つまりList<Integer> indices、JsonDeserialize アノテーションを持つフィールドを作成します。

于 2012-08-30T17:03:13.183 に答える