修复无效的JSON

时间:2018-09-23 08:37:04

标签: php arrays json validation

我有一个很大的文件,不幸的是包含无效的JSON。 看起来像数组列表,不分隔,中间用逗号:

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

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

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

尝试了许多组合,包括将“ ] [”替换为“ ]” [”,并用另外一个方括号对包装整个文件,使其成为数组数组。 每当它给我无效的JSON。

请帮助。

2 个答案:

答案 0 :(得分:0)

您可以将右方括号替换为']',然后将整个字符串用方括号括起来。

此代码段通过应用算法然后在结果字符串上调用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 );

答案 1 :(得分:0)

这是一个动态的php解决方案,但是我不得不使用它作为可靠的数据源。这是创可贴。不论哪种代码产生的无效JSON NEEDS都必须尽快修复。

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

整个字符串都用方括号括起来,以使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 (
      ),
    ),
  ),
)