2012-08-31 131 views
2

我有JSON字符串动态元素,到现在为止我解析成地图:Gson - 如何解析嵌套JSON的动态JSON字符串?

Map map = new Gson().fromJson(jsonString, 
     new TypeToken<HashMap<String, String>>() {}.getType()); 

现在,我需要解决thsi情况 - 这些动态变量之一可能是另一种JSON字符串。

你有什么建议可以解决吗?提前致谢。

编辑: JSON字符串添加例如(格式化):

{ 
    "key1": "val1", 
    "key2": "val2", 
    "key3": { 
     "subkey1": [ 
      "subvalue1", 
      "subvalue1" 
     ], 
     "subkey‌​2": [ 
      "subvalue2" 
     ] 
    }, 
    "key4": "val3" 
} 
+0

究竟是什么问题? –

+0

这给出了一个错误?如果是这样,哪个? –

+0

例如:{“key1”:“val1”,“key2”:“val2”,“key3”:{“subkey1”:“subvalue1”,“subkey2”:“subvalue2”},“key4”:“val3”}但我不是这个JSON的结构,所以我不知道是否有嵌套的JSON,如果是的话,我不知道它的结构。 – Artegon

回答

3

你叫什么其他JSON字符串就是一个JSON对象。 TypeToken>

String jsonString = "{\"key1\":\"val1\",\"key2\":\"val2\",\"key3\": {\"subkey1\":\"subvalue1\",\"subkey2\":\"subvalue2\"},\"key4\":\"val3\"}"; 

Map<String, Object> map = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>() { 
}.getType()); 

上面示例适用于GSON 2.2.2:地图值类型从字符串更改为对象。和系统输出(图)产生

{key1=val1, key2=val2, key3={subkey1=subvalue1, subkey2=subvalue2}, key4=val3} 

作为一个小的改进,我建议你明确指定地图类型的参数,并使用地图,而不是HashMap中的TypeToken。

+0

是的,现在它可以工作,谢谢。我通过地图中的分析对象循环,我正在处理它们 - 有什么办法如果对象是另一个地图,而不是字符串值如何解决? – Artegon

+0

@ user1315357显然有解决方法。问题是你想用它做什么。您可以使用_instanceof_参数测试_value_是否为_Map_。例如,您可以创建一些递归方法,如果它是一个字符串,则会打印出一个值,或者如果它是一个Map,则会遍历这些值并递归调用它们中的每一个。 如果你认为这个问题得到解答,你能接受吗? –

+0

它不适用于此JSON:{“key1”:“val1”,“key2”:“val2”,“key3”:{“subkey1”:[“subvalue1”,“subvalue1”],“subkey2”:由此PHP代码创建的[“subvalue2”]},“key4”:“val3”}(请注意,subkey1和subkey2是一个数组,并且不像以前那样只有一个值):$ foo = array(); $ foo [“key1”] ='val1'; $ foo [“key2”] ='val2'; $ foo [“key3”] = array('subkey1'=> array('subvalue1','subvalue1'),'subkey2'=> array('subvalue2')); $ foo [“key4”] ='val3'; var_dump(json_encode($ foo));'“不起作用”意味着这个嵌套的JSON对象没有被解析并返回为String。 – Artegon