3

我正在看一个看起来像这样的 json

{
    "key": "cow",
    "value": "woof"
}
{   
    "key": "dog",
    "value": "moo"
}

我想解析它,但 JSON.parse 不起作用,因为整个事情并不是真正的json。实际上也没有任何换行符,所以看起来像

{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}

至于为什么,这是来自 Comet 端点的流。理想情况下,它应该一个接一个地出现,但有时会有中断,在它回来后,我会收到自中断发生以来发生的所有更改的列表,串在一起。因此,如果三个 dicts 本来是在连接中断时掉下来的,我会在最后一次得到它们:

{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}{"key":"cat","value":"baaa"}

有什么方便的方法可以在浏览器中解析这种 json 吗?

编辑:对不起,伙计们,我没有提到对象可以任意嵌套,并且可以包含各种东西,Unicode 字符、数组、对象、带有对象的数组、各种形状和大小的括号等等等等。所以大多数 hacky在这些情况下,字符串拆分或正则表达式解决方案将失败。我没有把这些放在例子中,因为我很懒,但一个更有代表性的例子可能是

{
    "key": "cow",
    "value": {
        "body": "big",
        "name": "sally",
        "children": [
            "bob",
            "daisy"
        ]
    },
    "alt-key": "牛"
}
{   
    "key": "dog",
    "value": "moo{}{}{}}}} i love brackets[[[]] ]]]]      }{}",
    "array": [
        "豆沙包",
        "叉烧包"
    ]
}

尽管 regex/stringsplit 的事情在 95% 的时间里都可以工作,但我正在寻找一个严格正确的解决方案,当输入正确的 json 时它总是可以工作

4

4 回答 4

4

如果值和键不包含}{,您可以简单地添加逗号以使其有效 JSON(并添加方括号使其成为数组):

var json = '[' + json.replace(/}{/g, '},{') + ']';

如果您只获得一个对象作为响应,这甚至会起作用。

于 2012-07-10T16:36:28.187 回答
2

试试这样:

var arrayOfObjects = flowstring.match(/{.*?}/g).map(function(value){
    return JSON.parse(value);
});

你将拥有这个对象数组:

[{"key": "cow","value": "woof"},{"key": "dog","value": "moo"}.......]
于 2012-07-10T16:37:09.253 回答
0

尝试将其转换为数组,然后对其进行解析。像这样的东西:

var json = '{"key": "cow","value": "woof"}{"key": "dog","value": "moo"}';
var newjson = '[' + json.replace(/\}\{/g, '},{') + ']';
var obj = JSON.parse(newjson);
于 2012-07-10T16:37:38.580 回答
0

如果是我,我只会编写一个能够理解 JSON 表达式流的 JSON 解析器。JSON 与语法一样容易解析,并且制作能够为新句子“重置”自身的解析器很简单(一旦解析器存在)。

哎呀,你可以从 json.org 解析器本身开始。

可靠地“修复”您当前的数据是一个非常接近于编写解析器的项目。

于 2012-07-10T18:09:26.240 回答