您需要的JSONEncoder
一個子類,然後代理build_dict
功能
from __future__ import (absolute_import, division, print_function,)
# unicode_literals)
import collections
import json
mycollection = [1, 2, 3, 4]
def build_dict(_id):
d = dict()
d['my_' + str(_id)] = _id
return d
class SeqProxy(collections.Sequence):
def __init__(self, func, coll, *args, **kwargs):
super(SeqProxy, *args, **kwargs)
self.func = func
self.coll = coll
def __len__(self):
return len(self.coll)
def __getitem__(self, key):
return self.func(self.coll[key])
class JsonEncoderProxy(json.JSONEncoder):
def default(self, o):
try:
iterable = iter(o)
except TypeError:
pass
else:
return list(iterable)
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, o)
jsonencoder = JsonEncoderProxy()
collproxy = SeqProxy(build_dict, mycollection)
for chunk in jsonencoder.iterencode(collproxy):
print(chunk)
輸出繼電器的工作:
[
{
"my_1"
:
1
}
,
{
"my_2"
:
2
}
,
{
"my_3"
:
3
}
,
{
"my_4"
:
4
}
]
要由塊讀回塊,你需要使用JSONDecoder
和傳遞可致電object_hook
。這個鉤子會隨着每個新解碼的對象(在你的列表中的每個dict
)被調用,當你調用JSONDecoder.decode(json_string)
如果我不明白你的問題是錯誤的,似乎有可能編寫一個分隔符行,在你寫對象之後的每一次迭代中,你的數據不會有像「-----」那樣的分隔符,當你看到分隔符時創建一個新對象。 – alpert
啊,我明白了。這絕對有效。我認爲可能有其他流處理解決方案。 – CentAu