将Json解析为Map <string,string> </string,string>

时间:2014-02-21 08:46:51

标签: java android json parsing gson

我有Json响应,如:

[
 {       
   "first_name": "fname1",
   "last_name": "lname1"
 },
 {
   "first_name": "fname2",
   "last_name": "lname2",
   "city_name": "paris"
 },
 {
   "first_name": "fname2",
   "last_name": "lname2",
   "city_name": "paris",
   "Address": "1st Ave"
 }
 .
 .
 .
]

我在JsonObject中的字段是动态的,所以我不能使用带有预定义字段的类,所以我决定使用Map来解析Json响应,如下所示:

Collection<List<Map<String,String>>> list_Objects = null;
Reader reader = new InputStreamReader(is);
Gson gson = new Gson();
Type collectionType = new TypeToken<Collection<List<Map<String,String>>>>(){}.getType();
list_objects = gson.fromJson(reader, collectionType);

但它却抛出了这个错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1

我不是Json解析的专家所以请告诉我我的错误在哪里或者如果有其他方式来实现这样的行为我将非常感激。

2 个答案:

答案 0 :(得分:1)

我认为问题出在Collection上的List包装上。

您只需将list_Objects定义为List<Map<String, String>>

我刚刚尝试了以下杰克逊的ObjectMapper(它应该和GSON一样)并且它运作正常:

List<Map<String, String>> list_objects = objectMapper.readValue(jsonString, new TypeReference<List<Map<String, String>>>(){});

结果是ListLinkedHashMap个对象。

对于您的GSON示例,您只需删除Collection<>List<>,如果您愿意。

答案 1 :(得分:0)

如果我正确读到这个,你就是两次定义你的清单。

Collection<List<Map<String, String>>>会映射到

这样的结构

[ [ {"bla": "bla"}, {"bla": "bla"} ], [ {"foo": "bar"}, ... ], ... ]

(因为List是一种Collection)。所以,尝试使用List<Map<String, String>>,看看是否有效......