1

逆シリアル化する必要がある特定の形式の json があります。それを行うために、私は最高のライブラリ Gson で考えましたが、動的なキーがいくつかあるため、ここで問題に直面しています。

良い例で理解していただけると思います。これがjsonです:

{

"institution1": {
    "_id": "51cc7bdc544ddb3f94000002",
    "announce": { },
    "city": "Melun",
    "coordinates": [
        2.65106,
        48.528976
    ],
    "country": "France",
    "created_at": "2013-06-27T17:52:28Z",
    "name": "italien",
    "state": "Seine et Marne",
    "street": "Avenue Albert Moreau",
    "updated_at": "2013-06-27T17:52:28Z"
},
"institution2": {
    "_id": "51d1dfa8544ddb9157000001",
    "announce": {
        "announce1": {
            "_id": "51d1e036544ddb9157000002",
            "created_at": "2013-07-01T20:02:35Z",
            "description": "description formule 1",
            "institution_id": "51d1dfa8544ddb9157000001",
            "title": "formule dejeune",
            "type": "restoration",
            "updated_at": "2013-07-01T20:02:35Z"
        },
        "announce2": {
            "_id": "51d1e074544ddb9157000003",
            "created_at": "2013-07-01T20:03:08Z",
            "description": "description formule soir",
            "institution_id": "51d1dfa8544ddb9157000001",
            "title": "formule soiree",
            "type": "restoration",
            "updated_at": "2013-07-01T20:03:08Z"
        }
    },
    "city": "Melun",
    "coordinates": [
        2.65106,
        48.528976
    ],
    "country": "France",
    "created_at": "2013-07-01T19:59:36Z",
    "name": "restaurant francais chez pierre",
    "state": "Seine et Marne",
    "street": "Avenue Albert Moreau",
    "updated_at": "2013-07-01T19:59:36Z"
 }
}

ここに行くと、より良い景色を見ることができます。そのため、 JsonModel.javaというクラスを作成しました。

public class JsonModel
{
public HashMap<String, Institution> entries;

public static class Institution
{
    public String _id;
    public HashMap<String, Announce> announce;
    public String city;
    public String country;
    public List<Double> coordinates;
    public String created_at;
    public String name;
    public String state;
    public String street;
    public String updated_at;
}

public static class Announce
{
    public String _id;
    public String created_at;
    public String description;
    public String institution_id;
    public String title;
    public String type;
    public String updated_at;
}

}

そして、Gson に次のコードでデシリアライズするように依頼しました。

JsonModel data = new Gson().fromJson(json, JsonModel.class);

データがnullなので、期待どおりに機能していないと思います...そして、institution1、institution2などのキーが事前にわからないため、HashMapを使用することを考えました...どう思いますか? それをしてもいいですか ?

そして、ブラケットを使うように言わないでください、私はそれらを持つことを夢見ているだけです!

前もって感謝します !

編集: ルートオブジェクトを追加することで、このことを機能させることができました

{

  "root":{ ..the json.. }

}

および変更

    public HashMap<String, Institution> entries;

    public HashMap<String, Institution> root;

したがって、問題は gson が最初の要素を認識する必要があることですが、実際には json を変更することはできません。別の方法で行う方法はありますか?

4

1 に答える 1

1

a の使用Mapは完璧ですが、クラスを使用することはできません。そのクラスでは、JSONに、次のようにマップを表すというJsonModelフィールドを含むオブジェクトがあると想定しているためです。"entries"

{
  "entries": { the map here... }
}

そして、あなたはそれを持っていませんが、JSON はマップを直接表しています (マップを表すエントリと呼ばれるフィールドを持つオブジェクトではありません! )。つまり、これだけがあります:

{ the map here... }

したがって、それに応じて解析し、クラスJsonModelを削除し、直接 aMapを使用して逆シリアル化する必要があります...

TypeToken次のように、 のタイプを取得するには、 a を使用する必要がありますMap

Type mapType = new TypeToken<Map<String, Institution>>() {}.getType();

そして、次のように.fromJson()、そのタイプのメソッドを使用します。

Map<String, Institution> map = gson.fromJson(json, mapType);
于 2013-07-02T09:23:24.477 に答える