簡體   English   中英

在json序列化期間評估字典值

[英]Evaluating dictionary value during json serialization

我正在嘗試獲取一系列序列化詞典,其中只有一個特定值發生變化。

名為“obj”的虛構python dict

_gen = (value for value in range(5,10))
obj = {'mcu': {'led0': {'duty': _gen}}}

應該像這樣“工作”:

>>> 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}}}

應該像這樣“工作”

>>> <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}}}
import json

_gen = ({'mcu': {'led0': {'duty': value}}} for value in range(5, 10))

for obj in _gen:
    print json.dumps(obj)

運行收益率:

$ 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上運行代碼http://codebunk.com/b/49813922/

實際上這是最好的答案。 即使我對回答自己的問題感覺不舒服。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM