0

Jaxb/Jersey を使用して JSON-Response から Java オブジェクトにマップしたいと思います。私はそのようなJson応答を持っています:

{
"fuzzy": false,
"hits": [
    { ... }
],
"filters": {
    "category": {
        "selected": false,
        "values": { }
        },
        "id": "category",
        "name": "Kategorie"
    },
    "shop": {
        "selected": false,
        "values": {
            "7817": {
                "count": 2,
                "selected": false,
                "numeric_sort_key": null,
                "id": "7817",
                "name": "AZUGA"
            }
        },
        "id": "shop",
        "name": "Shop"
    },
    "11223": {
        "selected": false,
        "values": { },
        "id": "certificate",
        "name": "Vertrauensgarantie"
    },
    "11334": {
        "selected": false,
        "values": {
            "2290": {
                "count": 1,
                "selected": false,
                "numeric_sort_key": null,
                "id": "2290",
                "name": "22.90"
            }
        },
        "id": "price",
        "name": "Preis"
    }
},
"total_hits": 2

}

これは、Json 応答をマッピングしたい Bean です。

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;



@XmlRootElement
public class RestBean {

    @XmlElement
    private String fuzzy;

    @XmlElement
    private List<HitsBean> hits;

    @XmlElement
    private Filters filters;

    @XmlElement
    private String total_hits;
}

問題は、"filters" の子要素が動的であることです。つまり、子要素 "11223" と "11334" は実行時に作成されるため、子要素の名前を事前に知る方法はありません。これが私の Filters Bean です。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement(name="filters")
@XmlAccessorType(XmlAccessType.FIELD)
public class Filters {

    @XmlElement
    private Filter category;

    @XmlElement
    private Filter shop;

    @XmlAnyElement
    @XmlMixed
    private List<Filter> filt;
}

しかし、注釈 @XmlAnyElement は常にそのようなエラーをスローします:

23.04.2013 16:26:11 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SCHWERWIEGEND: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
org.w3c.dom.DOMException: INVALID_CHARACTER_ERR: An invalid or illegal XML character is specified. 
at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.checkQName(CoreDocumentImpl.java:2582)
at com.sun.org.apache.xerces.internal.dom.ElementNSImpl.setName(ElementNSImpl.java:117)
at com.sun.org.apache.xerces.internal.dom.ElementNSImpl.<init>(ElementNSImpl.java:80)
at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.createElementNS(CoreDocumentImpl.java:2095)
at com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM.startElement(SAX2DOM.java:164)
at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.closeStartTag(ToXMLSAXHandler.java:204)
at com.sun.org.apache.xml.internal.serializer.ToSAXHandler.flushPending(ToSAXHandler.java:277)
at com.sun.org.apache.xml.internal.serializer.ToXMLSAXHandler.startElement(ToXMLSAXHandler.java:646)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerHandlerImpl.startElement(TransformerHandlerImpl.java:263)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.DomLoader.startElement(DomLoader.java:107)
...

私の質問は、動的に生成された Json-Response、この場合は「11223」と「11334」をどのようにマッピングすればよいですか? 事前にどうもありがとうございました。

よろしく、 スパルノ

4

1 に答える 1

0

Jacksonマッパーと@JsonAnyGetter/@JsonAnySetter(org.codehaus.jackson.annotateパッケージ) アノテーションを使用すると、非常に簡単です。
クラス フィルター(ここでゲッター/セッターとデフォルトの XmlAccessorType を使用することが重要です)

public class Filters {

    private Filter category;

    private Filter shop;

    private Map<String, Filter> filt = new HashMap<String, Filter>();  

    @JsonAnyGetter
    public Map<String, Filter> any() {
       return filt;
    }

    @JsonAnySetter
    public void set(String name, Filter value) {
        filt.put(name, value);
    }

    // getters/setters for category and shop  
}  

@XmlAccessorType(XmlAccessType.FIELD)また、 JSON へのシリアル化のためにすべてのクラスで使用しないでください。getter/setter ペアとデフォルトのアクセサ タイプを使用します。

于 2013-04-24T21:01:55.337 に答える