2013-07-24 4 views
1

У меня есть следующая структура в json.Deserialize json array to map using Gson

[ 
    { 
    "Name": "FieldMapName1", 
     "Fields": [ 
     { 
     "Name": "FieldName1", 
     "Values": [ 
      { 
      "ID": 1, 
      "Value": "Value1" 
      }, 
      // ... 
     ] 
     }, 
     // ... 
    ] 
    }, 
    // ... 
] 

Есть ли способ, чтобы преобразовать его в:

Map<String, FieldMap> fieldMap; 

Каждый объект на карте поле содержит:

Map<String, Field> fields; 

И каждое поле:

Map<Integer, String> values; 

Должен ли я написать пользовательский десериализатор или есть некоторый бетт er подход?

ответ

3

Лучшим способом является использование TypeToken. Ваша структура может быть выражена как (да, общее некрасиво):

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

Тогда в JSON, падение ваших полей для коснуться как:

{"FieldMapName1":{"FieldName1":{"1":"value1", ...}},...} 

Затем использовать:

Map<String, Map<String, Map<Integer, String>>> map = new GsonBuilder().create().fromJson(json, t); 
+0

Я не могу изменить вход json ... – pixel

+0

Тогда я не думаю, что есть простой способ. Вы можете найти вдохновение в «MapTypeAdapterFactory» – PomPom

1

Вы определенно не можете разобрать свой JSON в структуре классов, которую вы хотите проанализировать, в основном потому, что ваш JSON не представляет эту структуру классов ...

Во-первых, весь ваш JSON окружен [ ], поэтому вы не можете разобрать его ни в одном Map, так как объект Map - это объект (в окружении { }), и то же самое происходит с другими элементами, которые вы хотите преобразовать в карты. ..

Ваш JSON элемент будет фактически представлен этой классовой структуры:

List<FieldMap> 

class FieldMap 
    String Name 
    List<Field> Fields 

class Field 
    String Name 
    List<Value> Values 

class Value 
    int ID 
    String Value 

Таким образом, вы можете либо разобрать ваш JSON в этой структуре, а затем переместить данные на структуру класса, или вы определенно будете иметь написать custom deserializer ... Вы можете найти пример here ... Вы можете попробовать, и если у вас возникли проблемы с созданием, попросите еще раз ...