使用尾随逗号处理多行 json

Process multi-line json with trailing commas

我在文件中有 JSON,其文本内容如下:

{
    "id": "01",
    "Variables": [
        {
            "Name": "myvar",
            "Value": "15"
        }
    ]
},
{
    "id": "01",
    "Variables": [
        {
            "Name": "myvar",
            "Value": "15"
        }
    ]
}

请注意,此示例有 2 条记录,每条记录分为多行,每行之间用逗号分隔。

记录之间的逗号分隔符使得处理变得困难,例如与 jq:

$ cat myfile.json | jq -s

解析错误:第 9 行“,”之前的预期值...

或 python:

import json
with open("alert_feedback_20220424.json", "r") as f:
    j = json.load(f)

json.decoder.JSONDecodeError:额外数据:第 9 行...

最终我真的想用spark读取这个数据:

spark.read.option(
    'sep', ','
).option(
    'header', False
).option(
    'multiLine', True
).csv(
    'file://my/project/data/myfile.json'
)

但这似乎没有正确解析 json。我会根据要求添加详细信息。

已尝试解决方案的链接:

如何以编程方式删除每条 JSON 记录后的逗号,或者如何格式化此 json 以便正确解析?

使用 jq,使用 -R 选项将整个文件作为原始文本读取,使用 -s 选项将其作为一个长字符串接收,将该字符串括在括号中,然后使用 fromjson 从 JSON 解码它。您现在应该有一个有效的数组。

jq -Rs '"[\(.)]" | fromjson' myfile.json
[
  {
    "id": "01",
    "Variables": [
      {
        "Name": "myvar",
        "Value": "15"
      }
    ]
  },
  {
    "id": "01",
    "Variables": [
      {
        "Name": "myvar",
        "Value": "15"
      }
    ]
  }
]

Demo

使用 .[] 来表示单个项目(中间没有逗号):

jq -Rs '"[\(.)]" | fromjson[]' myfile.json
{
  "id": "01",
  "Variables": [
    {
      "Name": "myvar",
      "Value": "15"
    }
  ]
}
{
  "id": "01",
  "Variables": [
    {
      "Name": "myvar",
      "Value": "15"
    }
  ]
}

Demo