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

Jes*_*ton 6 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
Run Code Online (Sandbox Code Playgroud)

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

{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}
Run Code Online (Sandbox Code Playgroud)

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

例如。Mag-Cutter = Weapon(data from json file)

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

Mar*_*ers 4

当然,使用 的第一个元素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])
Run Code Online (Sandbox Code Playgroud)

这会将所有第一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'}
Run Code Online (Sandbox Code Playgroud)