【问题标题】:How to include \n with python -m json.tool如何在 python -m json.tool 中包含 \n
【发布时间】:2015-11-03 20:40:55
【问题描述】:

我正在尝试通过 shell 创建一个 json 文件,但是,现在允许换行并通过错误。

Invalid control character at: line 5 column 26 (char 87) 指向\n

echo '{
    "param1": "asdfasf",
    "param2": "asffad",
    "param3": "asdfsaf",
    "param4": "asdfasf\nasfasfas"
}' | python -m json.tool > test.json

假设我想保留新行,我怎样才能得到这个来放置一个 json 文件?

更新:

我认为这与 python 的 json 编码器/解码器的严格模式有关。

如果 strict 为 False(默认为 True),则控制字符将 允许在字符串中。在此上下文中的控制字符是 字符代码在 0-31 范围内的字符,包括 '\t'(制表符), '\n'、'\r' 和 '\0'。

https://docs.python.org/2/library/json.html

如何从python -m json.tool 中将严格模式设置为False

【问题讨论】:

  • asdfasf 周围没有引号,否则它对我有用
  • 对不起,我修正了引号,但它仍然对我不起作用并输出相同的错误消息。
  • 你在什么外壳上试试这个?
  • 使用 zsh 时同样的错误

标签: python json shell python-2.7 zsh


【解决方案1】:

转义 \ 似乎可以解决问题:

echo  '{
    "param1": "asdfasf",
    "param2": "asffad",
    "param3": "asdfsaf",
    "param4": "asdfasf\\nasfasfas"
}' | python -m json.tool > test.json

它会创建有效的 json:

with open('/home/test.json', 'rU') as f:
    js = json.load(f)
    print(js)
    print(js["param4"])

输出:

{'param1': 'asdfasf', 'param3': 'asdfsaf', 'param2': 'asffad', 'param4': 'asdfasf\nasfasfas'}
asdfasf
asfasfas

【讨论】:

    【解决方案2】:

    zsh 正在用正确的回车替换\n。您可以转义它或改用heredoc 样式:

    python -m json.tool > test.json << EOF
    {
    "param1": "asdfasf",
    "param2": "asffad",
    "param3": "asdfsaf",
    "param4": "asdfasf\nasfasfas"
    }
    EOF
    

    【讨论】:

    • 同样,这会产生一个 json 文件,其中 json 本身包含字符串 \n
    • 但是 AFAIK 和 stackoverflow.com/questions/2392766/multiline-strings-in-json,实际换行符在 JSON 中是非法的。
    • 例如,如果您在具有正确换行符的文件中创建输入 JSON 并将其添加到 Python 命令中,您将收到相同的错误 :)
    • 谢谢我之前没有意识到这一点。
    • 此外,严格模式与序列化有关,但您的错误将发生在反序列化。使用json.load(input) 在找到实际的回车时会引发类似的错误:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多