【问题标题】:Python: JSON.dumps to structure { key: [ key: val ] }Python:JSON.dumps 到结构 { key: [ key: val ] }
【发布时间】:2014-02-13 05:47:59
【问题描述】:

我正在处理一个 CSV 文件,并尝试使用 JSON.dumps 从那里写入 JSON 文件。我想要的数据结构是

{
    "key1": {"innerkey1": "value1", … "innerkeyn": "valuen"},
    ...
    ...
    ...
}

然而,JSON.dumps 语法似乎要求我写

json.dumps({"key1": {"innerkey1": "value1", … "innerkeyn": "valuen"}})

这极大地改变了结构的含义(并且不是有效的 JSON,因为转储在列表理解中被迭代。

我猜我对 dict 语法的理解有误,但不能完全理解。

编辑:编辑以更改大括号类型。问题仍然是 {"key1" ... } 正在为每个项目编写,我希望一组 hogan 大括号环绕整个结构,但是

json.dumps("key1": {"innerkey1": "value1", … "innerkeyn": "valuen"}) 

在分号上抛出语法错误

EDIT2: json.dumps 被调用 n 次,每次都被写入文件。输出文件如下所示:

{"key1": {"innerkey1": "value1", … "innerkeyn": "valuen"}},
{"key2": {"innerkey1": "value1", … "innerkeyn": "valuen"}}

这种语法使 JSON 期望在第一个封闭的 hogan 集末尾的逗号表示文件结束。所需的输出是

{ 
    "key1": {"innerkey1": "value1", … "innerkeyn": "valuen"},
    "key2": {"innerkey1": "value1", … "innerkeyn": "valuen"}
}

【问题讨论】:

  • key1 的值看起来像 dict,但您在它周围使用了 list 大括号。
  • 所需的数据结构无效。 [] 应该是 {}
  • {key: [key:val]} 应该是{key: {key:val}}
  • 你的第一个dumps怎么没有给你想要的?
  • 它在多行上运行,所以我得到 {"key1: {…}}, {"key2": {…}},这使得 JSON 在第一个逗号处期望 EOF。跨度>

标签: python json


【解决方案1】:

看起来您希望 dumps 只为内部键发出部分 JSON,我认为您无法做到这一点。我建议要么将整个字典(以及所有顶级键)传递给 dumps 调用,以便它可以编写整个内容,或者手动处理外部大括号和键,只使用 dumps内部字典。

或者,您可以照原样使用json.dumps,并在写出之前去掉开头和结尾的大括号(即只打印出the_json[1:-1])。

【讨论】:

  • 我会用它和数组切片,这似乎是最好的。
  • 请记住,您必须自己处理逗号分隔符。
  • 没关系。 myfile.write(jsondumps + ",\n") 应该没问题
【解决方案2】:

通过您的编辑,您希望一个key1 存储多个结果吗?

{
    "key1": [{"innerkey1": "value1", … "innerkeyn": "valuen"},
             {"innerkey2": "value1", … "innerkeyn": "valuen"},
             {"innerkey3": "value1", … "innerkeyn": "valuen"}]
}

这有点像在黑暗中拍摄。从臀部开始。

【讨论】:

    【解决方案3】:

    如果我理解正确,您希望在每次迭代中输出一些“部分”json 字符串(其本身不是有效的 json),例如

    "key1": {"innerkey1": "value1", … "innerkeyn": "valuen"},
    

    但是 json.dumps 不输出“部分 json”,只输出有效的 json。

    所以,要么:

    • 首先将整个文档的所有结果收集到一个 dict 中,然后调用一次 json.dumps。
    • 或者,自己写出第一个和最后一个文档括号和"key1": 部分,并仅将 json.dumps 用于{"innerkey1": "value1", … "innerkeyn": "valuen"} 部分

    【讨论】:

    • 是的,同意。接受 tzaman 的回答,因为他先回答。
    • 没问题,它发生了。至少你得到了两方的确认;)
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多