Python数据处理, 使用json表达式获取json数据值

from collections import abc


class FrozenJson:
    '''一个只读接口,该接口使用属性表示法访问json类对象
    '''


    def __init__(self, mmapping):
        self.__data = dict(mmapping)

    def __getattr__(self, name):
        try:
            return getattr(self.__data, name)
        except AttributeError:
            return FrozenJson.build(self.__data[name])
        
    def __dir__(self):
        return self.__data.keys()
        
    
    @classmethod
    def build(cls, obj):
        if isinstance(obj, abc.Mapping):
            return cls(obj)
        elif isinstance(obj, (list, tuple)):
            return [cls.build(item) for item in obj]
        else:
            return obj

二、测试示例:

json_data:

{ "Schedule":
  { "conferences": [{"serial": 115 }],
    "events": [
      { "serial": 34505,
        "name": "Why Schools Don´t Use Open Source to Teach Programming",
        "event_type": "40-minute conference session",
        "time_start": "2014-07-23 11:30:00",
        "time_stop": "2014-07-23 12:10:00",
        "venue_serial": 1462,
        "description": "Aside from the fact that high school programming...",
        "website_url": "http://oscon.com/oscon2014/public/schedule/detail/34505",
        "speakers": [157509],
        "categories": ["Education"] }
    ],
    "speakers": [
      { "serial": 157509,
        "name": "Robert Lefkowitz",
        "photo": null,
        "url": "http://sharewave.com/",
        "position": "CTO",
        "affiliation": "Sharewave",
        "twitter": "sharewaveteam",
        "bio": "Robert ´r0ml´ Lefkowitz is the CTO at Sharewave, a startup..." }
    ],
    "venues": [
      { "serial": 1462,
        "name": "F151",
        "category": "Conference Venues" }
    ]
  }
}

二、测试示例

test_Fronzen.py

def test_FrozeJson():
    import json
    raw_json = json.load(open('./FrozenJson/osconfeed.json', 'r'))
    from ..FrozenJson.FrozenJson import FrozenJson
    obj = FrozenJson(raw_json)
    target = 'obj.Schedule.conferences[0].serial'
    assert eval(target) == 115



文章标签:

评论(0)