1

このあたりで解決策を探していたのですが、私の質問に対する正しい答えが見つからなかったので、お尋ねしたいと思います。

いくつかの単純な属性を持つ POJO があります。および別の POJO の 1 つのリスト。

public class Standard implements Serializable {
    private String id;
    private String title;
    private String description;
    private Set<Interpretation> interpretations = new LinkedHashSet<Interpretation>();
}

public class Interpretation implements Serializable {
    private String id;
    private String title;
    private String description;
}

私のコントローラ クラスでは、GSON を使用して標準 POJO を返しています。

@RequestMapping(value="/fillStandard", method= RequestMethod.GET)
public @ResponseBody String getStandard(@RequestParam String id) {
    Standard s = DAOFactory.getInstance().getStandardDAO().findById(id);
    return new Gson().toJson(s);
}

問題は、標準 POJO で jQuery を使用して解釈のリストを取得できるかどうかです。何かのようなもの :

function newStandard() {
$.get("standard/fillStandard.htm", {id:"fe86742b2024"}, function(data) {
    alert(data.interpretations[0].title);
});

}

どうもありがとう !

編集: まあ、@Atticus のおかげで、私の問題の解決策があります。それが誰かを助けることを願っています。

@RequestMapping(value="/fillStandard", method= RequestMethod.GET, produces="application/json")
    public @ResponseBody Standard getStandard(@RequestParam String id) {
        Standard s = DAOFactory.getInstance().getStandardDAO().findById(id);
        return s;
    }

を使用@ResponseBodyすると POJO 全体を返すことができますが、注釈に追加produces="application/json"する必要があります。@RequestMappingそうすれば、私が想定していたように、返されたオブジェクトを jQuery で JSON としてキャッチできるようになります。

function newStandard() {
$.get("standard/fillStandard.htm", {id:"idOfStandard"}, function(data) {
    alert(data.id);    //Standard id
    alert(data.interpretations[0].title);   //id of Interpretation on first place in array
});
4

1 に答える 1

0

カスタムシリアライザーを作成して登録する必要があります。

こんなふうになります:

//You create your builder that registers your custom serializer with the class you want to serialize
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Standard.class, new StandardSerializer());

//Then you create your Gson object
Gson gson = builder.create();
//Then you pass your object to the gson like
Standard s = DAOFactory.getInstance().getStandardDAO().findById(id);
gson.toJson(s);

シリアライザーは次のようになります。

public class StandardSerializer implements JsonSerializer<Standard>{

    @Override
    public JsonElement serialize(Standard src, Type typeOfSrc,
            JsonSerializationContext context) {

            JsonObject obj = new JsonObject();
            //You put your simple objects in like this
            obj.add("id",new JsonPrimitive(src.getId()));
            //You put your complex objects in like this
            JsonObject interpretations = new JsonObject();
            //Here you need to parse your LinkedHashSet object and set up the values. 
            //For the sake of simplicity I just access the properties (even though I know this would not compile)
            interpretations.add("title", src.getInterpretation().getTitle());
            obj.add("interpretations", interpretations);
            return obj;
        }

}

この場合、Jsonは次のようになります。

{"id":"idValue", "title":"titleValue", "description":"descriptionValue", "interpretations":["id":"interpretationIdValue"]}

jQueryこれで、次のようにデータにアクセスできます。

function newStandard() {
$.get("standard/fillStandard.htm", {id:"fe86742b2024"}, function(data) {
    alert(data.interpretations.title);
});
}

これがお役に立てば幸いです。

編集: あなたの応答が宣言されたメソッド引数タイプに変換されることがわかります(ここでString述べられているように:16.3.3.2サポートされているメソッドリターンタイプ)。しかし、本当に必要なのは、POJOをJSONに変換することです。私はSpringにあまり詳しくありませんが、ここ(16.3.2.6 Producible Media Types)を読んだように、別の、おそらくより簡単な解決策があります。JSONオブジェクトを返す場合は、メソッドの戻りタイプ をではなくに変更して、アノテーションに追加します。私が読んだ限りでは、これはリターンタイプをJSONに変換する必要があることを示しているはずです。この場合、を使用する必要はありません。StandradgetStandardStandardStringproduces="application/json"@RequestMappingSpringGson

于 2012-06-25T14:44:22.520 に答える