2013-03-05 2 views
0

я следующие классы Java:Как разобрать JSON для списка с помощью карт в Gson?

public class ModuleParsed { 

    String id_component; 
    String id_instance; 
    Map<ModuleParam, ModuleParam> input; 
    Map<ModuleParam, List<ModuleParam>> output; 
    int id_paas; 
} 

и

public class ModuleParam { 

    String name; 
    Object type; 
} 

что должно быть в формате JSON, как ожидается, разобрать его как List<ModuleParsed>?

listModules = gson.fromJson(br, new TypeToken<List<ModuleParsed>>() {}.getType()); 

Все было нормально, пока я не представил параметры ввода и вывода.

EDIT

Делая обратный процесс я нашел JSON должно быть что-то вроде

[ 
    { 
     "id_component": "mod1", 
     "id_instance": "mod1_inst1", 
     "input": { 
      "moduleParam": { 
       "name": "param3", 
       "type": "obj3" 
      }, 
      "moduleParam": { 
       "name": "param2", 
       "type": "obj2" 
      } 
     }, 
     "id_paas": 1 
    }, 
    { 
     "id_component": "mod2", 
     "id_instance": "mod2_inst1", 
     "input": { 
      "moduleParam": { 
       "name": "param3", 
       "type": "obj3" 
      }, 
      "moduleParam": { 
       "name": "param2", 
       "type": "obj2" 
      } 
     }, 
     "id_paas": 1 
    } 
] 

где moduleParam элементы не были чем-то вроде: [email protected]

Независимо от того, как я называю эти элементы я получаю следующую ошибку:

Exception in thread "main" com.google.gson.JsonParseException: Expecting object found: "moduleParam" 

Как я могу получить класс ModuleParsed с Gson?

+1

Использование изменчивых сложных объектов в качестве клавиш «Карта» - это очень плохая идея, особенно если вы не переопределили равные и хэш-коды. Вам также очень сложно создать из них полезный JSON. См. Http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/GsonBuilder.html#enableComplexMapKeySerialization() –

+0

@Brian, было бы возможно, если бы я просто использовал Map > вместо этого? – eskalera

ответ

0

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

public class ModuleParsed { 

    String id_component; 
    String id_instance; 
    Map<String, ModuleParam> input; 
    Map<String, List<ModuleParam>> output; 
    int id_paas; 
} 

public class ModuleParam { 

    String name; 
    String id_module; 
    String id_instance; 
} 

, для которого я построил следующий JSON

[ 
    { 
     "id_component": "mod1", 
     "id_instance": "mod1_inst1", 
     "input": { 
      "input1": {} 
     }, 
     "output": { 
      "output1": [ 
       { 
        "name": "input1", 
        "id_module": "mod2", 
        "id_instance": "mod2_inst1", 
        "type": "paramType" 
       }, 
       { 
        "name": "input2", 
        "id_module": "mod2", 
        "id_instance": "mod2_inst1", 
        "type": "paramType" 
       } 
      ], 
      "output2": [] 
     }, 
     "id_paas": 1 
    }, 
    { 
     "id_component": "mod2", 
     "id_instance": "mod2_inst1", 
     "input": { 
      "input1": { 
       "name": "output1", 
       "id_module": "mod1", 
       "id_instance": "mod1_inst1", 
       "type": "paramType" 
      }, 
      "input2": { 
       "name": "output1", 
       "id_module": "mod1", 
       "id_instance": "mod1_inst1", 
       "type": "paramType" 
      } 
     }, 
     "output": {}, 
     "id_paas": 1 
    } 
] 

JSON был проанализирован правильно на этот раз.