如何处理读取带有python注释的.json文件?

时间:2017-09-20 09:00:54

标签: python json

首先,我理解评论无效json。也就是说,出于某种原因,我必须处理的.json文件在行的开头和行的末尾都有注释。

我如何在python中处理这个并基本上加载.json文件但忽略了注释以便我可以处理它?我目前正在做以下事情:

with open('/home/sam/Lean/Launcher/bin/Debug/config.json', 'r') as f:
        config_data=json.load(f)

但是这会在json.load(f)命令崩溃,因为文件f中有注释。

我认为这将是一个常见的问题,但我找不到很多在线RE如何在python中处理它。有人建议使用commentjson但这会让我的脚本崩溃说

ImportError: cannot import name 'dump'

当我导入commentjson

思想?

编辑: 这是我必须处理的json文件的片段。

{
  // this configuration file works by first loading all top-level
  // configuration items and then will load the specified environment
  // on top, this provides a layering affect. environment names can be
  // anything, and just require definition in this file. There's
  // two predefined environments, 'backtesting' and 'live', feel free
  // to add more!

  "environment": "backtesting",// "live-paper", "backtesting", "live-interactive", "live-interactive-iqfeed"

  // algorithm class selector
  "algorithm-type-name": "BasicTemplateAlgorithm",

  // Algorithm language selector - options CSharp, FSharp, VisualBasic, Python, Java
  "algorithm-language": "CSharp"
}

4 个答案:

答案 0 :(得分:2)

切换到json5JSON 5 是一个非常小的 JSON 超集,它支持注释和一些您可以忽略的其他功能。

import json5 as json
# and the rest is the same

它是测试版,速度较慢,但​​如果您只需要在启动程序时读取一些简短的配置,这可能可以作为一种选择。换一个标准总比不遵守要好。

答案 1 :(得分:0)

有点破解(因为如果json数据中有//则会失败)但对于大多数情况来说足够简单:

import json,re

s = """{
  // this configuration file works by first loading all top-level
  // configuration items and then will load the specified environment
  // on top, this provides a layering affect. environment names can be
  // anything, and just require definition in this file. There's
  // two predefined environments, 'backtesting' and 'live', feel free
  // to add more!

  "environment": "backtesting",// "live-paper", "backtesting", "live-interactive", "live-interactive-iqfeed"

  // algorithm class selector
  "algorithm-type-name": "BasicTemplateAlgorithm",

  // Algorithm language selector - options CSharp, FSharp, VisualBasic, Python, Java
  "algorithm-language": "CSharp"
}
"""

result = json.loads(re.sub("//.*","",s,flags=re.MULTILINE))

print(result)

给出:

{'environment': 'backtesting', 'algorithm-type-name': 'BasicTemplateAlgorithm', 'algorithm-language': 'CSharp'}

将正则表达式应用于所有行,删除双斜杠以及后面的所有行。

也许解析该行的状态机会更好地确保//不在引号中,但这稍微复杂一些(但可行)

答案 2 :(得分:0)

我还没有亲自使用它,但你可以查看JSONComment python包,它支持使用注释解析json文件。用它代替JsonParser

parser = JsonComment(json)
parsed_object = parser.loads(jsonString)

答案 3 :(得分:0)

您可以使用以下内容取出评论:

data=re.sub("//.*?\n","",data)
data=re.sub("/\\*.*?\\*/","",data)

这应删除数据中的所有注释。如果你的字符串中有//或/ *

,它可能会导致问题