Python达成JSON反连串化类对象的示范

讲反序列化的时候,实现序列化和反序列化,讲反序列化的时候,实现序列化和反序列化,import json,使用 JSON 函数需要导入 json 库,一种方式是先使用json.load或json.loads反序列化得到dict对象,然后对这个dict对象进行编码处理

Python达成JSON反种类化类对象的演示,json种类化

我们的互联网协议一般是把数量转变到JSON之后再传输。从前在Java中间,完成系列化和反体系化,不管是
jackson ,依旧 fastjson
都非常的归纳。现在有项目需求用Python来支付,很当然的企盼那样的便利也能在Python中反映。

可是在网络看了有个别学科,讲反系列化的时候,基本都以改变为 dict 或许 array
。这种编制程序情势本人从心情上是爱莫能助经受的。难道是这一个JSON库都不辅助反体系化为类对象?作者立马消除了这几个主见,Python那样强劲的脚本语言,十分小概未有宏观的JSON库。

于是乎笔者就钻探了弹指间原生的 json ,以及第三方的 demjson 和 simplejson 。

一、原生json

自己留心研商了原生 json 的 loads 方法的定义

复制代码 代码如下:
def loads(s, encoding=None, cls=None, object_hook=None,
parse_float=None, parse_int=None, parse_constant=None,
object_pairs_hook=None, **kw)

这在那之中的 object_hook 和 object_pairs_hook
参数引起了本身的注目,小编重视说一下 object_hook 。

官方文书档案的印证如下:

object_hook is an optional function that will be called with the
result of any object literal decoded (a dict). The return value of
object_hook will be used instead of the dict. This feature can be
used to implement custom decoders (e.g. JSON-RPC class hinting).

这个 object_hook
遵照文书档案的表达正是多个自定义解码函数,入参数规范反类别化后的dict,我们能够依附自个儿的条条框框调换输出为想要的格式。

自个儿又去搜了一晃 object_hook
,大家对此这么些东西的管理格局基本正是用一个静态方法把dict转变来对象。

笔者们的数据结构是那般的

{"status":1,"info":"发布成功","data":{"id":"52","feed_id":"70"}}

于是小编就写了这么的代码:

class Response:

  def __init__(self, status, info, data) -> None:
    super().__init__()
    self.status = status
    self.info = info
    self.data = data

  @staticmethod
  def object_hook(d):
    return Response(d['status'], d['info'], d['data'])
 ...
resp = json.loads(body, object_hook=Response.object_hook)

一起头吧,确实并没不日常,即便用起来未有java的json库辣么方便,但终归达成了供给。

好景十分长,我测量试验的第八个接口再次来到的数量中, data
是字段八个字符串,反体系化符合规律。可是后来当接口重返的结构中 data
字段是二个dict结构的时候, object_hook 的入参居然产生了 data
字段转变之后的dict( {“id”:”52″,”feed_id”:”70″} ),并不是全体的数额。

这一个懵逼了,上网寻找了一圈未有定论。于是上网搜了一圈,也从不敲定。
好啊,作者最终又赶回官方文书档案, read the fucking official document 。

不看不知底,一看吓一跳,官方文书档案用了一种高超的方法完毕了地点的供给。

>>> class JSONObject:
...   def __init__(self, d):
...     self.__dict__ = d
...
>>>
>>> data = json.loads(s, object_hook=JSONObject)
>>> data.name
'ACME'
>>> data.shares
50
>>> data.price
490.1
>>>

自己服了,把json深入分析之后的dict间接赋值给指标的品质dict,然后就可以任意的选取质量了,真心方便,动态语言正是好。

如上是法定的json库完毕方案,这别的五个响当当的第三方库呢?

二、demjson

demjson 也补助 hook 。有二种配备的主意: decode 函数配置和 set_hook
函数配置

1. decode

def decode( txt, encoding=None, **kwargs )

decode 函数能够钦点非常多参数,在那之中就回顾 hook 函数。 hook
函数的钦定是使用键值对的方法,键是 hook 函数的称呼,值是 hook 函数。

demjson是透过名字来治本hook函数的,所以hookname不是无论内定的,务必是放置的三种hook函数的称呼。

  1. decode_number
  2. decode_float
  3. decode_object
  4. decode_array
  5. decode_string
  6. encode_value
  7. encode_dict
  8. encode_dict_key
  9. encode_sequence
  10. encode_bytes
  11. encode_default

demjson.decode(body, encode='utf-8',decode_obbject=Reponse.object_hook)

结果并不曾让作者很开森,照旧是不可能管理嵌套结构。 日志中呈现如下内容:

2018-01-30 16:01:17,137 poster.py post_all 73 INFO    :
{“status”:1,”info”:”\u53d1\u5e03\u6210\u529f”,”data”:{“id”:”54″,”feed_id”:”72″}}
2018-01-30 16:01:17,138 response.py object_hook 13 INFO    : {‘id’:
’54’, ‘feed_id’: ’72’}
2018-01-30 16:01:17,138 response.py object_hook 13 INFO    :
{‘status’: 1, ‘info’: ‘公布成功’, ‘data’: demjson.undefined}

很奇怪的是 object_hook 函数被调用了几次,第三回是 data
字段的剧情,第二是一切的从头到尾的经过,但是 data 字段未有分析出来。
大吃一惊,百思不得其解!!!

2. set_hook

set_hook 函数跟上面的 decode 函数不一样等,它是 JSON 类的积极分子函数,而
decode 函数是个静态函数。

def set_hook(self, hookname, function)

摄取以前的训诫,这一次本身留神阅读了demjson的文书档案,还真开掘点东西。

Netsted values. When decoding JSON that has nested objects or arrays,
the decoding hooks will be called once for every corresponding value,
even if nested. Generally the decoding hooks will be called from the
inner-most value outward, and then left to right.

此地最主要聊到嵌套的主题材料,出现嵌套的时候,每一个对应的类别都会调用 hook
函数三次,而且是从最内层,从左往右。好吧,此前出现的主题素材总体清楚了,原本都是那一个准则惹的祸,可是为啥这么设计作者最近照旧不亮堂。

set_hook 的利用办法

j = demjson.JSON()
  j.set_hook( 'decode_array', my_sort_array )
  j.decode(body, encode='utf-8')

三、simplejson

眼下说了那么多, simplejson 的不二等秘书技就没怎么可说的,跟官方的 json 库 hook
形式同样。

总结

即便小编的需即便满意了,但是依然有二个大大的问号留在作者心坎,为啥是如此设计,英特网未有找到合适的答案,剩下的内需探究源代码分析了。

以上正是本文的全部内容,希望对大家的读书抱有辅助,也期望大家多多协理帮客之家。

大家的互连网合同一般是把数量转变到JSON之后再传输。以前在Java里边,完结系列化和反体系…

{"status":1,"info":"发布成功","data":{"id":"52","feed_id":"70"}}

importdemjson

Python中分析JSON并还要开展自定义编码管理实例,pythonjson

在对文本内容或字符串进行JSON反系列化(deserialize)时,由于原有内容编码难题,或者须求对反体系化后的从头到尾的经过展开编码处理(如将unicode对象调换为str)。

在Python中,一种办法是先利用json.load或json.loads反系列化获得dict对象,然后对这么些dict对象进行编码管理。

但实质上在json.load与json.loads中,有可选参数object_hook。通过应用此参数,能够对反体系化获得的dict直接开展拍卖,并利用管理后新的dict取代原dict重临。

行使办法为:

复制代码 代码如下:

d = json.loads(json_str, object_hook=_decode_dict)

附Shadowsocks中应用的_decode_dict与_decode_list:

复制代码 代码如下:

def _decode_list(data):
    rv = []
    for item in data:
        if isinstance(item, unicode):
            item = item.encode(‘utf-8’)
        elif isinstance(item, list):
            item = _decode_list(item)
        elif isinstance(item, dict):
            item = _decode_dict(item)
        rv.append(item)
    return rv
 
def _decode_dict(data):
    rv = {}
    for key, value in data.iteritems():
        if isinstance(key, unicode):
            key = key.encode(‘utf-8’)
        if isinstance(value, unicode):
            value = value.encode(‘utf-8’)
        elif isinstance(value, list):
            value = _decode_list(value)
        elif isinstance(value, dict):
            value = _decode_dict(value)
        rv[key] = value
    return rv

参考:
1.
2.

在对文件内容或字符串实行JSON反类别化(deserialize)时,由于原有内容编码难题,…

class Response:

  def __init__(self, status, info, data) -> None:
    super().__init__()
    self.status = status
    self.info = info
    self.data = data

  @staticmethod
  def object_hook(d):
    return Response(d['status'], d['info'], d['data'])
 ...
resp = json.loads(body, object_hook=Response.object_hook)

importjson

那么些懵逼了,上网查找了一圈未有结论。于是上网搜了一圈,也从不定论。
好呢,笔者最后又回来官方文书档案, read the fucking official document 。

实例

可是在网络看了某个学科,讲反系列化的时候,基本都以改换为 dict 或然 array
。这种编程格局自个儿从心境上是无力回天经受的。难道是这一个JSON库都不帮助反体系化为类对象?作者当下打消了那个主张,Python那样强劲的脚本语言,相当的小概未有宏观的JSON库。

条件布署

def loads(s, encoding=None, cls=None, object_hook=None,
parse_float=None, parse_int=None, parse_constant=None,
object_pairs_hook=None, **kw)

list, tuplearray

不看不知底,一看吓一跳,官方文书档案用了一种高超的点子贯彻了地点的须要。

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding=”utf-8″, default=None, sort_keys=False, **kw)

demjson.decode(body, encode='utf-8',decode_obbject=Reponse.object_hook)

{

复制代码 代码如下:

data=[{‘a’:1,’b’:2,’c’:3,’d’:4,’e’:5}]

自家留神探究了原生 json 的 loads 方法的概念

decode将已编码的 JSON 字符串解码为 Python 对象

官方文档的印证如下:

#!/usr/bin/pythonimportjson

吸收之前的教训,这一次本身稳重翻阅了demjson的文书档案,还真开掘点东西。

语法

你或然感兴趣的篇章:

  • python
    接口重返的json字符串实例
  • 使用Django和Python创建Json
    response的方法
  • Python达成将json文件中向量写入Excel的主意
  • python
    对象和json相互转变方法
  • 运用python将json数据调换为csv格式的艺术
  • python怎样读写json数据
  • python2.7 json
    调换日期的管理的亲自过问
  • python3.x上post发送json数据
  • python使用json体系化datetime类型实例深入分析
  • Python
    Json类别化与反种类化的亲自去做
  • python 3.6
    tkinter+urllib+json达成列车车的班次音信查询功用
  • Python轻松读取json文件功用示例
  • 浓密深入分析python数据开采Json结构分析

printjson

一、原生json

json.dumps 用于将 Python 对象编码成 JSON 字符串。

object_hook is an optional function that will be called with the
result of any object literal decoded (a dict). The return value of
object_hook will be used instead of the dict. This feature can be
used to implement custom decoders (e.g. JSON-RPC class hinting).

以下实例体现了Python 怎么着解码 JSON 对象:

Netsted values. When decoding JSON that has nested objects or arrays,
the decoding hooks will be called once for every corresponding value,
even if nested. Generally the decoding hooks will be called from the
inner-most value outward, and then left to right.

json=demjson.encode(data)

那之中的 object_hook 和 object_pairs_hook
参数引起了自家的小心,小编首要说一下 object_hook 。

如上代码实践结果为:

1. decode

{u’a’: 1, u’c’: 3, u’b’: 2, u’e’: 5, u’d’: 4}接待加群301056069联合具名谈谈学习

一初阶吧,确实尚未难题,即便用起来没有java的json库辣么方便,但毕竟实现了须求。

#!/usr/bin/python

j = demjson.JSON()
  j.set_hook( 'decode_array', my_sort_array )
  j.decode(body, encode='utf-8')

[{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}]

>>> class JSONObject:
...   def __init__(self, d):
...     self.__dict__ = d
...
>>>
>>> data = json.loads(s, object_hook=JSONObject)
>>> data.name
'ACME'
>>> data.shares
50
>>> data.price
490.1
>>>

语法

2. set_hook

函数描述

def set_hook(self, hookname, function)

arraylist

于是笔者就钻研了眨眼之间间原生的 json ,以及第三方的 demjson 和 simplejson 。

运用第三方库:德姆json