【问题标题】:Parsing/manipulating weirdly formated json array解析/操作格式怪异的 json 数组
【发布时间】:2015-08-06 21:40:24
【问题描述】:

我有以下损坏的 javascript json 字符串

[ 'some string's', 'inside, array', 60.4, 10.3, '' ]

我想将从网页的脚本部分抓取的这个损坏的 json 字符串解析为 javascript 数组 - 但如您所见,它不是有效的 json。字符串是单引号的,并且字符串内也可以有单引号。所以我需要用双引号替换字符串项周围的单引号,而不更改字符串内的单引号。

这里有正则表达式魔术师吗?

更新: 字符串也可以包含逗号,项目也可以是数字。

提示: 寻找模式', ' 来分隔字符串项可能会起作用。

【问题讨论】:

  • 您尝试做的事情通常不是正则表达式可解决的。那是因为正则表达式不适用于嵌套。除非您有有关输入的更多信息,否则您将需要一个适当的解析器(这可能不容易实现)。例如,它始终是一个平面列表。
  • 更改创建 JSON 的代码以添加反斜杠/转义,或用双引号括起来。
  • 我无法更改内容的创建方式,因为我从网页上抓取了数据。
  • 老兄,你肯定做错了什么。您向我们展示的示例至少有两种解释:1 元素数组或 2 元素数组。我怀疑任何网站都可以使用这种模棱两可的表示。
  • @freakish 是的,这很奇怪。我正在使用脚本标记抓取网页,因此该数组被声明为 javascript 数组,但我将其解析为字符串..我会更多地研究数据..

标签: javascript regex json string single-quotes


【解决方案1】:

假设您的“坏”JSON 字符串始终以 [ ' 开头并以 ' ] 结尾,我们可以先“修剪”字符串,然后使用 ', ' 拆分。

    var str = "[ 'some string's', 76, 'inside, array', '', 60.4, 10.3, '', 56 ]";
    str = str.replace(/^\[ | \]$/g, '')
    var re = /'(.*?)'(?=,|$)|(\d+(?:\.\d+)?)(?=,|$)/g; 
    var m;
    arr = [];
    
    while ((m = re.exec(str)) !== null) {
        if (m.index === re.lastIndex) {
            re.lastIndex++;
        }
        if (m[1] != undefined) {
           arr.push(m[1]);
           document.getElementById("res").innerHTML += m[1] + "<br/>";
        }
        else
        {
           arr.push(m[2]);
           document.getElementById("res").innerHTML += m[2] + "<br/>";
        }
    }
    alert(arr);
&lt;div id="res"/&gt;

但是,请注意修复 JSON 的最佳方法是在 JSON 提供者端修复它。如果您有更复杂的 JSON 字符串,则需要增强此解决方案。

【讨论】:

  • 如果, 是价值的一部分呢?其实现在想想,这个问题根本解决不了。看看 OP 的例子。我们怎么知道它是 2 个元素的数组,而不是一个以 some string's', 'inside array 为值的 1 元素数组?模棱两可。
  • 我还在一些字符串中找到了逗号 - 我无法更改它,因为我是从网页上抓取的..
  • 是的,在这些情况下会有歧义。我只为当前示例提出了一种方法。我同意这通常是无法解决的。
  • 也许寻找模式 ', ' 来分隔字符串项目可能有效?
  • 请检查。同样,如果您有更复杂的 JSON,这仍然可能会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2020-08-07
相关资源
最近更新 更多