gpt4 book ai didi

python - 不打算使用 json.load 反序列化在 Python 中保存为字符串的 json

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:50 25 4
gpt4 key购买 nike

strdata = strdata + json.dumps(data, default=lambda o: o.__dict__)

我正在使用它将来自各种 api 调用的 json 数据连接成一个字符串。

现在,当我想读取数据/将变量“strdata”加载为 json 格式时,使用

json.loads(strdata)

但它不起作用。我假设考虑到我正在将一个序列化字符串与另一个字符串连接起来,我应该先转储整个 strdata 然后再加载它。但这也不管用。

最佳答案

strdata初始化为一个列表:

strdata = []

在循环内,将 JSON 转储附加到列表中:

strdata.append(json.dumps(data, default=lambda o: o.__dict__))

将列表存储在文件中:

json.dump(strdata, f)

从文件加载列表:

strdata = json.load(f)

要检索原始数据(或 data.__dict__ 代理),对 strdata 中的每个项目调用 json.loads:

[json.loads(item) for item in strdata]

JSON 有一个 well-defined format .您无法通过简单地连接两个 JSON 字符串来创建有效的 JSON(例如元素列表)。


有一种更复杂的方法来处理这个问题:使用自定义编码器 (cls=CustomEncoder) 和自定义解码器 (object_hook=custom_decoder):

import json

class Foo(object):
def __init__(self, x=1, y='bar'):
self.x = x
self.y = y

class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Foo):
return obj.__dict__
else:
return json.JSONEncoder.default(self, obj)

filename = '/tmp/test.json'
with open(filename, 'w') as f:
json.dump(
[Foo(1, 'manchego'), Foo(2, 'stilton'), [{'brie': Foo(3,'gruyere')}]],
f, cls=CustomEncoder)

def custom_decoder(dct):
try:
return Foo(**dct)
except TypeError:
return dct

with open(filename, 'r') as f:
newfoo = json.load(f, object_hook=custom_decoder)
print(newfoo)
# [{"y": "manchego", "x": 1}, {"y": "stilton", "x": 2}, [{"brie": {"y": "gruyere", "x": 3}}]]

这样做的好处是只需要调用一次 json.dump 来存储数据,也只需要调用一次 json.load 来检索数据。

关于python - 不打算使用 json.load 反序列化在 Python 中保存为字符串的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16760916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com