【问题标题】:Gson - how to parse dynamic JSON string with nested JSON?Gson - 如何使用嵌套 JSON 解析动态 JSON 字符串?
【发布时间】:2012-08-31 11:50:30
【问题描述】:

我有带有动态元素的 JSON 字符串,直到现在我将它解析为 Map:

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

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

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

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

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

【问题讨论】:

  • 这会报错吗?如果有,是哪个?
  • 例如:{"key1":"val1","key2":"val2","key3": {"subkey1":"subvalue1","subkey2":"subvalue2"}," key4":"val3"} 但我没有这个 JSON 的结构,所以我不知道是否有一些嵌套的 json,如果有,我不知道它的结构。
  • 是的,有一个异常:线程“main”com.google.gson.JsonSyntaxException 中的异常:java.lang.IllegalStateException:应为字符串,但在第 1 行第 57 列为 BEGIN_ARRAY
  • 根据this other question I found,如果您的json数据无效(在这种情况下使用[),应该会发生这种情况,但是我看不出您发布的json有什么问题.
  • 很奇怪,我会检查结构,但 JSON 字符串是通过 PHP 函数 json_encode() (php.net/manual/en/function.json-encode.php) 生成的。现在谢谢。

标签: java json parsing gson


【解决方案1】:

你所说的另一个 JSON 字符串只是一个 json 对象。将 Map 值类型从 String 更改为 Object: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。 sysout(map) 产生

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

作为一个小改进,我建议您明确指定映射类型参数,并使用 Map 而不是 HashMap 作为 TypeToken。

【讨论】:

  • 是的,现在可以了,谢谢。我遍历 Map 中的已解析对象并正在处理它们 - 如果 Object 是另一个 Map 而不是字符串值,有什么方法可以解决?
  • @user1315357 显然有办法解决它。问题是你想用它做什么。您可以使用 instanceof 参数测试 value 是否为 Map。例如,您可以创建一些递归方法,如果它是字符串则打印出一个值,或者如果它是 Map 则迭代这些值,并为每个值递归调用自身。如果您认为此问题已得到解答,您能接受吗?
  • 它不适用于这个 JSON:{"key1":"val1","key2":"val2","key3":{"subkey1":["subvalue1","subvalue1 "],"subkey2":["subvalue2"]},"key4":"val3"} 由这个 PHP 代码创建(注意 subkey1 和 subkey2 是一个数组,而不是以前的单个值):$foo = array(); $foo["key1"] = 'val1'; $foo["key2"] = 'val2'; $foo["key3"] = array('subkey1'=&gt;array('subvalue1','subvalue1'),'subkey2'=&gt;array('subvalue2')); $foo["key4"] = 'val3'; var_dump(json_encode($foo));"doesn 't work" 表示这个嵌套的 JSON 对象没有被解析,而是作为字符串返回。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多