【问题标题】:Fix invalid JSON [duplicate]修复无效的 JSON [重复]
【发布时间】:2018-09-23 08:37:03
【问题描述】:

我有一个包含无效 JSON 的大文件。 它看起来像数组列表,没有用逗号分隔

[{
    "key": "value"
}]
[
    [{
            "key": "value",
            "obj": {}
        },
        {}
    ]
]
[{
    "key": "value",
    "obj": {}
}]

每个方括号对内的内容似乎是一个本身有效的 JSON

问题是如何用“搜索和替换”快速修复这个JSON? (或任何其他方法)

尝试了许多组合,包括将 "][" 替换为 "],[" 并用另一对方括号将整个文件包裹起来,使其成为数组数组。 每次它都给我无效的 JSON。

请帮忙。

【问题讨论】:

  • jsonlint.com 这可能会对您有所帮助。这是一个在线 json 验证器。
  • 显示您的搜索结果并替换此示例数据
  • 如果将所有“][”替换为“],[”,还需要在文件开头添加[,在末尾添加],这样它就是一个大数组.
  • @Venify,这正是我所做的。这就是 jsonlint 所说的:错误:第 12260956 行的解析错误:...,{} ] ] --------------------^ Expecting ',', '] ',得到'EOF'
  • 该错误表示存在未关闭的盈余[

标签: php arrays json validation


【解决方案1】:

您可以将右括号替换为 '],' 并将整个字符串包裹在括号中。

这个 sn-p 通过应用算法然后在结果字符串上调用 eval 来说明使用提供的示例数据的方法。

let jsonString = `[{
    "key": "value"
}]
[
    [{
            "key": "value",
            "obj": {}
        },
        {}
    ]
]
[{
    "key": "value",
    "obj": {}
}]`;

jsonString = jsonString.replace( /]/g, '],' );
jsonString = '[' + jsonString + ']';

myObject = eval( jsonString );

console.log( typeof myObject);
console.log( myObject.length );
console.log( myObject );

【讨论】:

    【解决方案2】:

    这是一个动态的 php 解决方案,但我不得不将其用作可靠的数据源。这是一个创可贴。无论生成此无效 json 的代码如何,都需要尽快修复。

    我的正则表达式模式将查找所有出现的]、零个或多个空格,然后是],然后它会在] 之后添加一个逗号。

    整个字符串用方括号括起来,使json字符串有效。

    风险可能对所有人都显而易见,也可能不明显——如果任何实际键或值包含符合替换条件的字符串,那么它们将被损坏。这就是为什么不建议在 json 上使用正则表达式的原因。

    代码:(Demo)

    $bad_json = '[{
        "key": "value"
    }]
    [
        [{
                "key": "value",
                "obj": {}
            },
            {}
        ]
    ]
    [{
        "key": "value",
        "obj": {}
    }]';
    $valid_json = "[" . preg_replace("~]\K(?=\s*\[)~", ",", $bad_json) . "]";
    
    var_export(json_decode($valid_json, true));
    

    输出:

    array (
      0 => 
      array (
        0 => 
        array (
          'key' => 'value',
        ),
      ),
      1 => 
      array (
        0 => 
        array (
          0 => 
          array (
            'key' => 'value',
            'obj' => 
            array (
            ),
          ),
          1 => 
          array (
          ),
        ),
      ),
      2 => 
      array (
        0 => 
        array (
          'key' => 'value',
          'obj' => 
          array (
          ),
        ),
      ),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2013-12-02
      • 2012-05-11
      • 2013-02-18
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多