【问题标题】:Parsing "JSON" containing trailing commas解析包含尾随逗号的“JSON”
【发布时间】:2012-06-18 15:47:43
【问题描述】:

是否有任何 Python JSON 解析器可以处理尾随逗号?

(我正在使用来自外部源的“JSON”并且无法控制它。)

【问题讨论】:

  • 但是您可以控制在 1) 检索 JSON 和 2) 将其提供给 JSON 解析器之间的操作。
  • JSON 不包含尾随逗号。
  • 对,一种选择是在解析数据之前尝试清理数据。我只是想知道是否可能有更宽松的 JSON 解析器,因为据说某些浏览器可以处理 JSON 中的尾随逗号。
  • 向其提供者报告格式错误的 json。如果他们没有正确输出,它对任何人都没有用。
  • @Acorn:仅仅因为一些浏览器接受它并不意味着你的代码也应该接受——这就是不合格软件的传播方式——埃里克说的就是这样。

标签: python json malformed


【解决方案1】:

获取 PyYAML。 JSON 是 YAML 的子集,因此 YAML 解析器应该解析大多数 JSON。 YAML 的语法允许在序列中使用逗号。

【讨论】:

  • 我确实在某处看到了这个建议作为解决方案,但也看到在冒号后提到空格是强制性的,这会使其不太有用。经过测试,只要键是带引号的字符串,似乎空格不是强制性的。如果 JSON 的键是数字且冒号后没有空格,则不会解析。
  • 我假设将数字作为键的情况很少见,但找到它真是太棒了。或许可以向 PyYAML 维护者提及这个功能并向他们解释用例。
  • 这是一个很棒的小技巧,特别是对于从无法控制输出的来源进行抓取。 (即 - 网络抓取)
【解决方案2】:

json-cfg 似乎支持允许它的 JSON 扩展。它还允许 cmets 和不带引号的键。

>>> import jsoncfg
>>> jsoncfg.loads('{"key1": "{my tricky value,}", }')
OrderedDict([('key1', '{my tricky value,}')])

可以使用 [JSONParserParams] 类禁用额外的选项(cmets 和不带引号的键):

jsoncfg.loads('{"key1": "{my tricky value,}" /*nope*/}', jsoncfg.JSONParserParams(allow_comments=False, allow_unquoted_keys=False))

这完全不用担心允许整个 YAML 语法。此外,与基于正则表达式的预处理和过于简单的模块(如 jsoncomment)不同,它实现了完整的 tokenizer and parser(适合非正则语言)以避免嵌套问题(如逗号尾随 ]} 在字符串中)。

这个库是否仍在维护是一个悬而未决的问题。它肯定可以使用更多的文档。

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2017-04-29
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多