使用Json数据初始化python中的对象?

时间:2014-09-26 21:04:25

标签: python json

这就是我现在所得到的。

import urllib2
import json
from pprint import pprint


response = urllib2.urlopen('http://census.soe.com/get/ps2:v2/weapon_datasheet?c:start=0&c:limit=1&c:show=capacity,clip_size,damage,fire_rate_ms,item_id,reload_ms')
response1 = urllib2.urlopen('http://census.soe.com/get/ps2:v2/item?c:start=0&c:limit=1&c:show=name.en,description.en,item_id')
data = json.load(response)
data1 = json.load(response1)
pprint(data)
pprint(data1)


class Weapon(object):
    """Creates a PlanetSide2 Weapon"""
    def __init__(self, capacity, clip_size, damage, fire_rate_ms, itemd_id, 
                 reload_ms, description, name):
        self.capacity = capacity
        self.clip_size = clip_size
        self.damage = damage
        self.fire_rate_ms = fire_rate_ms
        self.item_id = item_id
        self.reload_ms = reload_ms
        self.description = description
        self.name = name

现在我的数据看起来像这样。

{u'returned': 1,
 u'weapon_datasheet_list': [{u'capacity': u'210',
                             u'clip_size': u'30',
                             u'damage': u'143',
                             u'fire_rate_ms': u'75',
                             u'item_id': u'73',
                             u'reload_ms': u'2455'}]}
{u'item_list': [{u'description': {u'en': u"The New Conglomerate's Mag-Cutter features a powerful electromagnet capable of cutting through enemy body armor."},
                 u'item_id': u'1',
                 u'name': {u'en': u'Mag-Cutter'}}],
 u'returned': 1}

有没有办法使用json中的数据用武器名称初始化武器对象?

例如,

Mag-Cutter = Weapon(data from json file)

如何从json文件数据中读取设置Weapon类变量?

1 个答案:

答案 0 :(得分:3)

当然,使用data['weapon_datasheet_list']的第一个元素加上data1['item_list']的第一个元素中的一些数据:

name = data1['item_list'][0]['name']['en']
description = data1['item_list'][0]['description']['en']
mag_cutter = Weapon(name=name, description=description, 
                    **data['weapon_datasheet_list'][0])

这将第一个weapon_datasheet_list项的所有应用为Weapon()构造函数的关键字参数,将该字典中的键与构造函数的参数名称相匹配。我手动提供的其余两项namedescription

这确实意味着您需要更正Weapon.__init__签名中的拼写错误; itemd_id应拼写item_id以匹配JSON结构。

演示:

>>> import urllib2
>>> import json
>>> from pprint import pprint
>>> response = urllib2.urlopen('http://census.soe.com/get/ps2:v2/weapon_datasheet?c:start=0&c:limit=1&c:show=capacity,clip_size,damage,fire_rate_ms,item_id,reload_ms')
>>> response1 = urllib2.urlopen('http://census.soe.com/get/ps2:v2/item?c:start=0&c:limit=1&c:show=name.en,description.en,item_id')
>>> data = json.load(response)
>>> data1 = json.load(response1)
>>> class Weapon(object):
...     """Creates a PlanetSide2 Weapon"""
...     def __init__(self, capacity, clip_size, damage, fire_rate_ms, item_id, 
...                  reload_ms, description, name):
...         self.capacity = capacity
...         self.clip_size = clip_size
...         self.damage = damage
...         self.fire_rate_ms = fire_rate_ms
...         self.item_id = item_id
...         self.reload_ms = reload_ms
...         self.description = description
...         self.name = name
... 
>>> name = data1['item_list'][0]['name']['en']
>>> description = data1['item_list'][0]['description']['en']
>>> mag_cutter = Weapon(name=name, description=description, 
...                     **data['weapon_datasheet_list'][0])
>>> pprint(vars(mag_cutter))
{'capacity': u'210',
 'clip_size': u'30',
 'damage': u'143',
 'description': u"The New Conglomerate's Mag-Cutter features a powerful electromagnet capable of cutting through enemy body armor.",
 'fire_rate_ms': u'75',
 'item_id': u'73',
 'name': u'Mag-Cutter',
 'reload_ms': u'2455'}