Dart嵌套JSON对象解析失败:多对象加逗号后jsonDecode无返回
排查JSON解析失败的问题
我来帮你搞定这个jsonDecode解析失败的问题!你遇到的情况,十有八九是JSON语法里藏了容易漏掉的小错误,先从你给出的示例代码说起,里面已经有两处不符合JSON规范的地方了:
你提供的示例JSON:
{ "version": 1, "data": [{ "married": true, "subs":[ { "name":{ "sub1":{} }, }, ] }, ]}
首先看现有语法错误:
subs数组里第一个对象的末尾有个多余的逗号("sub1":{} },这里的逗号)- 最外层
data数组的最后一个元素后面也有多余逗号({...}, ]}这里的逗号)
JSON是严格不允许尾随逗号的,虽然有些编程语言或编辑器支持,但标准JSON解析器(包括jsonDecode)遇到这种情况会直接解析失败。
再说说你添加第二个"name"对象时的问题
我猜你可能写成了类似下面的代码:
{ "version": 1, "data": [{ "married": true, "subs":[ { "name":{ "sub1":{} }, "name":{ "sub2":{} } }, ] }, ]}
这里除了依然存在尾随逗号的问题,还有一个致命错误:JSON对象中不允许出现重复的键名。同一个对象里出现两个"name"键,解析器要么直接报错,要么会忽略掉后面的那个键,导致你看不到预期的结果。
正确的写法分两种情况:
情况1:在subs数组里添加多个独立的带name的对象
如果是要给subs数组增加元素,应该把每个带name的对象作为数组的独立项,同时去掉所有尾随逗号:
{ "version": 1, "data": [ { "married": true, "subs": [ { "name": { "sub1": {} } }, { "name": { "sub2": {} } } ] } ] }
情况2:在同一个对象里存放多个名称相关的内容
如果是想在同一个subs元素里放多个name相关的对象,那应该把name改成数组类型,比如叫names:
{ "version": 1, "data": [ { "married": true, "subs": [ { "names": [ {"sub1": {}}, {"sub2": {}} ] } ] } ] }
快速排查错误的小技巧
你可以直接用浏览器的开发者控制台来测试JSON是否合法:把你的JSON字符串用引号包裹,然后执行JSON.parse('你的JSON内容'),控制台会直接抛出错误信息,告诉你具体哪里出了问题(比如哪个位置有多余的逗号,或者重复键名)。
内容的提问来源于stack exchange,提问作者user65825
相关产品推荐
相关产品推荐

