【问题标题】:How to remove \n, \r, \t in a json如何删除 json 中的 \n、\r、\t
【发布时间】:2019-12-30 14:28:12
【问题描述】:

我正在使用 jq 创建一个 json 文件。这是输出:

{
   "temperature":"21", 
   "humidity":"12.3", 
   "message":"Today ID 342 is running"
}
{
   "temperature":"13", 
   "humidity":"40.1", 
   "message":"Today ID 98 is running"
}

如果我尝试使用 Python 打开这个文件,它会给我错误,除非我像这样手动删除换行符和制表符:

{"temperature":"21","humidity":"12.3","message":"Today ID 342 is running"}
{"temperature":"13","humidity":"40.1","message":"Today ID 98 is running"}

我尝试在 jq 中使用 -j 选项,但没有任何改变。有什么建议?使用其他程序的解决方案也很好(sed 等)。谢谢!!

【问题讨论】:

  • 您的消息可以包含"Who\tId\nAlcor\t342\n" 等特殊字符吗?或者您可以使用tr -d 并在完成后在每个} 之后添加一个换行符?

标签: json jq


【解决方案1】:

json 字典或列表中的制表符、换行符或空格绝对可以。

该文件不是有效的 json 文档,因为它包含 许多 json 文档(在本例中为字典),由换行符分隔。这样做的结果是 not 一个有效的 json 文档,并且不能被严格的 json 解析器解析。至少不是 Python 的 json 库附带的那个。

如果您接受使用jq 预处理文件,则可以使用-s 选项将这些对象放入列表中:

jq -s . input.json > output.json
cat output.json
[
  {
    "temperature": "21",
    "humidity": "12.3",
    "message": "Today ID 342 is running"
  },
  {
    "temperature": "13",
    "humidity": "40.1",
    "message": "Today ID 98 is running"
  }
]

然后在 Python 中使用json.load

import json

with open('output.json') as file_desc:
    measurements = json.load(file_desc)

纯python解决方案可以在这里找到:How I can I lazily read multiple JSON values from a file/stream in Python?

【讨论】:

  • 感谢您的回答。那么为什么如果我手动删除换行符,即使没有列表格式,python 也会识别文件? jq 有没有办法删除所有换行符,将换行符保留在每个 json 字符串的末尾?
  • 如果您尝试json.load() 包含多个字典的文件,Python 将引发 JSONDecodeError。我刚刚仔细检查了它。不知道你到底在做什么,但只是 jq -c 不起作用
  • 我使用了json.loads(),它成功了,我现在又试了一次,它成功了。我正在逐行读取文件并将每个 json 存储在一个列表中。
  • 好的,单独加载每个文档,逐行加载应该可以。如果你已经使用jq,你也可以像我展示的那样使用jq -s,然后一次性加载整个文档列表。
【解决方案2】:

好的,我通过禁用 jq 的默认漂亮打印解决了这个问题。我添加了 -c 选项,现在每个 json 都在一行上:

jq -c . file.json > file2.json
cat file2.json
{"temperature":"21","humidity":"12.3","message":"Today ID 342 is running"}
{"temperature":"13","humidity":"40.1","message":"Today ID 98 is running"}

我这样加载它们:

import json

measurements = []
with open('file2.json') as file_desc:
    for line in file_desc:
        # Treat each line as a separate document
        measurements.append(json.loads(line))

【讨论】:

  • 我不知道为什么答案没有用,也许解决方案不可复制。我正在寻找其他可行的解决方案。
  • 我没有对答案投反对票,但我认为只是不清楚你是如何解决的。我从答案下方的 cmets 中的信息中添加了这一点。
  • 通常该解决方案应该有效。我可以想象我使用jq -s 的解决方案在处理大文件时速度更快,但我还没有尝试过。
猜你喜欢
  • 2012-06-04
  • 2020-06-20
  • 2011-03-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多