【问题标题】:How to process the file which have multiple json object and add new json object in the file?如何处理具有多个 json 对象的文件并在文件中添加新的 json 对象?
【发布时间】:2019-07-18 15:51:21
【问题描述】:

我有多个 json 对象的文件:{"key1": "value1"}{"key2": "value2"}。我想将 json 文件更新为 {"key1": "value1000"} 并添加新条目:{“key3”:“value3”}。我不知道如何将新的 json 对象添加到文件中。

更新后的 JSON 文件将类似于:{}{}{}。请注意 JSON 对象不是逗号分隔的文件。此文件包含一组 JSON 对象,这些对象是从 Google Cloud Storage 中提取的。

def main_v2():
    data = ""
    with open('data.json', 'r') as outfile:
        for line_data in outfile:
            obj = json.loads(line_data)
            if len(obj["keys"]) > 1:
                keys = obj["keys"][1:  len(obj["keys"])]
                obj["keys"] = obj["keys"][0: 1]
                for key in keys:
                    temp = obj
                    temp['keys'] = key

            ##
            I don't know how to add new entry 
            ##  
     json.dump(data, 'jsonFile.data')

if __name__ == "__main__":
    main_v2()

【问题讨论】:

  • 人们试图告诉您的是您的文件格式不是有效的 JSON 格式。请参阅JSON specification。您从 Google Cloud Storage 提取数据的方式并没有创建有效的 JSON 文件。
  • 解决此问题的另一种方法是以某种方式解析并将您拥有的文件转换为合法的 JSON。如果您可以提供现有文件的更全面的示例,那么如果您自己想不出办法,那么有人可以帮助您。
  • @martineau 正确 Google Cloud Storage 未创建有效的 JSON 文件。但是,我按照您的建议创建了有效的 JSON 数据。谢谢
  • 极客:很高兴听到...在这种情况下,如果您仍有问题,您需要更新其中的内容或询问另一个问题。
  • geeks:实际上将整个文件转换为有效的 JSON 文件需要先将整个文件读入内存。但是,您问题中的代码需要在每一行上都有一个 JSON 对象,这实际上是一种称为 JSON Lines or JSONL 的相关格式(另请参见 Wikipedia article 上的内容)。基本上,您需要它采用像 {}\n{}\n{}\n 这样的格式,每个对象之间都有换行符。

标签: python json python-3.x python-2.7


【解决方案1】:

首先,你得到了错误的 JSON: 这个:

{"key1": "value1"}{"key2": "value2"}

应该替换为:

{"key1": "value1", "key2": "value2"}

使用此语法,您可以使用json.loads()。如果您有一些额外的字符或错误的 JSON 语法,请在使用 json.loads() 之前对其进行预处理。 如果您这样做,则向您的“dict”添加新的键、值对,并且使用 python 进行更新非常简单:

import json

dict = json.loads('{"key1": "value1", "key2": "value2"}')
dict["key1"] = "value1000" #update existing value
dict["key3"] = "value3" #add new value

【讨论】:

  • 我已经更新了这个问题。此文件包含从 Google Cloud Store 提取的 json 对象集合
  • 集合是指对象数组吗?示例:[{"key1": "value1"},{"key2":"value2"}].
【解决方案2】:

json 文件有 2 种类型。

  1. 文件中的单个 json - {"key":"value","key":"value"}
  2. json 对象数组 - [{"key":"value","key":"value"},{"key1":"value","key2":"value"},....]

所以,首先你需要验证你的 json。在加载 json 文件时,json.load() 会处理它。下面的代码是针对第一种情况的

import json

data = json.load(open('data.json','r'))
data["key"] = "new_value" ## Update operation
data["new_key"] = "some_value" ## Insert new key-value pair
with open('data.json','w') as f:
     json.dump(data,f)

如果文件中包含不带逗号的json,并且每个json都换行,可以用\n分割文件数据,然后用逗号连接字符串,保存为json对象数组。

文件格式:

{"key1": "value1"}
{"key2": "value2"}

代码:

data = open('data.json','r').read().split("\n")
data = '[' + ','.join(data) + ']'
with open('data.json','w') as f:
     f.write(data)

稍后将文件处理为普通的json文件

【讨论】:

  • 更新问题,这个文件有一个 JSON 对象的集合,是从谷歌云存储中提取的。
  • "如果文件包含没有逗号的 json,并且如果每个 json 都在新行上" => 那么它是一个 jsonlines 文件 (jsonlines.org) 并且已经有一个可以使用它的库(jsonlines.readthedocs.io/en/latest)。
  • 哦,谢谢@brunodesthuilliers。我不知道图书馆。
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2012-09-09
  • 2016-01-09
  • 1970-01-01
  • 2019-05-14
  • 2020-12-18
相关资源
最近更新 更多