0

私は今日、GSON を使用して JSON 解析と格闘してきましたが、最小限の手間で多くのことがうまくいきました。

ただし、次の JSON 文字列については、いくつかの問題が発生し始めました。

{"success":1,"response":{"dvds":{"IronMan":{"rating":"awesome"},"BatMan":{"rating":"awesome"},"Smurfs":{"rating":"childish"}}}}

この JSON には、応答タイプのコレクションを含むコレクション「応答」があります。この例では、含まれている唯一の応答タイプは DVD です。しかし、私の問題はここにあります。「dvds」のすべての子を List 応答に解析し、各子を単一の Dvd クラス オブジェクト (文字列「タイトル」と文字列「評価」を含む) にしたいと考えています。

これまでのところ、個別の値/オブジェクトの解析と配列の解析は実際の問題はありませんでしたが、そのようなコレクションの解析を解決する方法に頭を悩ませることはできません。

今日のグーグルは「TypeTokens」を参照し続けましたが、この問題に関するさまざまなトピックのコードを見て、使用シナリオにそれを実装する方法をまだまったく理解していません。

具体的に言うと、「どうすれば GSON に自分の応答タイプと dvd コレクションの両方を正しく認識させることができますか?」

現在、私の ResponseData.class は次のようになっています。

public class ResponseData {
    public int success;

    public List<ResponseTypes> responsetypes;

    public class ResponseType{
        public List<Dvd> Dvds;
    }

    public class Dvd{
        public String title;
        public String rating;
    }
}

これは、この問題を配列ベースの形式で見る方法ですが、今回は代わりにオブジェクトのコレクションに遭遇した場合に適用する必要があります。すべてのシナリオで、オブジェクトのクラスはその親の名前で認識できるはずだと考えることができます。

現在、解析は次のように開始されます。

try{
    Gson gson = new Gson();
    Reader reader = new InputStreamReader(stream);
    ResponseData responsedata = gson.fromJson(reader, ResponseData.class);
    return responsedata;
}

誰かが私を助けてくれることを本当に願っています!ありがとう!

4

1 に答える 1

1

ここにいくつかの問題があります:

  1. クラスは保持さResponseDataれるべきであり、保持されるべきではList<ResponseType>ありませんList<ResponseTypes>
  2. あなたが提供したjsonは上記のクラスと一致しません。この json の正確なクラスは次のとおりです。

    public class ResponseData
    {
        public int success;
        public Map<String, Map<String, Dvd>> response;
    
        public class Dvd
        {
            public String rating;
        }
    }
    
  3. json でリストを記述するには、"[ ]" を使用する必要があります。例: [1,2,3]。ここでjsonの詳細を読むことができます

  4. 上記で説明したクラス階層をjsonで説明したい場合。次のようになります。

    {"success":1,"responseTypes":[{"Dvds":[{"title":"IronMan","rating":"awesome"},{"title": "BatMan", "rating":"素晴らしい"},{"タイトル":"スマーフ", "評価":"幼稚"}]}]}

  5. 変数名と json 変数名の間のマッピングを宣言しない限り、同じ名前を使用する必要があることに注意してください。たとえば、「Dvds」と「responseTypes」

于 2013-10-10T15:36:25.270 に答える