Python 在json序列化期间计算字典值
我正在尝试获取一系列序列化字典,其中只有一个特定值发生更改 名为“obj”的虚构python dict “工作”应该是这样的:Python 在json序列化期间计算字典值,python,json,serialization,dictionary,lazy-evaluation,Python,Json,Serialization,Dictionary,Lazy Evaluation,我正在尝试获取一系列序列化字典,其中只有一个特定值发生更改 名为“obj”的虚构python dict “工作”应该是这样的: >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 5}}} >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 6}}} >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 7}}} _placeho
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
_placeholder = <some trick to create a placeholder>
obj = {'mcu': {'led0': {'duty': _placeholder}}}
有什么办法可以存档吗
也可以这样做:
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
_placeholder = <some trick to create a placeholder>
obj = {'mcu': {'led0': {'duty': _placeholder}}}
\u占位符=
obj={'mcu':{'led0':{'duty':_占位符}}
应该这样“工作”吗
>>> <placeholder modification trick> = 5
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> <placeholder modification trick> = 6
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> <placeholder modification trick> = 7
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
>>=5
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:5}}
>>> = 6
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:6}}
>>> = 7
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:7}}
运行收益率:
$ python gen.py
{"mcu": {"led0": {"duty": 5}}}
{"mcu": {"led0": {"duty": 6}}}
{"mcu": {"led0": {"duty": 7}}}
{"mcu": {"led0": {"duty": 8}}}
{"mcu": {"led0": {"duty": 9}}}
可以将生成器表达式包装到函数中:
import json
def generate_generator(a, b):
return ({'mcu': {'led0': {'duty': value}}} for value in range(a, b))
for obj in generate_generator(2, 7):
print json.dumps(obj)
这里有一个解决方案
导入json
class Gen(object):
def __init__(self):
self.x = 1
def next(self):
self.x+=1
return self.x
class Gencoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Gen):
return obj.next()
return json.JSONEncoder.default(self, obj)
_gen = Gen()
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
你可以在CodeBunk上运行代码,事实证明这是最好的答案。尽管我对回答自己的问题感到不舒服
import json
import types
_gen = (value for value in range(5, 10))
property = {'mcu':{'led0':{'duty': _gen}}}
def generator_handler(obj):
if isinstance(obj, types.GeneratorType):
return obj.next()
else:
return None
print json.dumps(property, default=generator_handler)
print json.dumps(property, default=generator_handler)
print json.dumps(property, default=generator_handler)
它是否必须与barebones
json.dumps一起工作?使用自定义编码器或指定默认值
函数可以轻松地将生成器替换为其当前值。该死,不能使用此功能,因为我需要能够将_gen传递到函数中,因为_gen将在创建dict之前存在。这将迫使我使用斯皮卡维戈的答案。很抱歉删除了accept。我本来打算将其用作已接受的答案,但找到了一个较短的答案,它实际上使用了生成器。@DanielF我也使用了该答案:)