Python处理JSON

news2024/9/22 19:43:38

Python处理JSON

####概念
序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。

Python2.6开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encodingdecoding

encoding:把一个Python对象编码转换成Json字符串
decoding:把Json格式字符串解码转换成Python对象
对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。

#####json.dumps方法对简单数据类型encoding:

import json
data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象
print "DATA:",repr(data)

data_string = json.dumps(data)
print "JSON:",data_string

输出:

DATA: [{'a':'A','c':3.0,'b':(2,4)}] #python的dict类型的数据是没有顺序存储的
JSON: [{"a":"A","c":3.0,"b":[2,4]}]  

JSON的输出结果与DATA很相似,除了一些微妙的变化,如python的元组类型变成了Json的数组,Python到Json的编码转换规则是:
在这里插入图片描述

#####json.loads方法处理简单数据类型的decoding(解码)转换

import json
data = [{'a':"A",'b':(2,4),'c':3.0}]  #list对象

data_string = json.dumps(data)
print "ENCODED:",data_string

decoded = json.loads(data_string)
print "DECODED:",decoded

print "ORIGINAL:",type(data[0]['b'])
print "DECODED:",type(decoded[0]['b'])

输出:

ENCODED: [{"a": "A", "c": 3.0, "b": [2, 4]}]
DECODED: [{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]
ORIGINAL: <type 'tuple'>
DECODED: <type 'list'>

解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型,Json到Python的解码规则是:

在这里插入图片描述

####json的人文关怀
编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出。

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}

indent参数根据数据格式缩进显示,读起来更加清晰:

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)
print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    "a": "A",
    "b": [
      2,
      4
    ],
    "c": 3.0
  }
]

separators参数的作用是去掉,,:后面的空格,从上面的输出结果都能看到", :"后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数:

import json

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)             :', len(repr(data))
print 'dumps(data)            :', len(json.dumps(data))
print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))

输出:

DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
repr(data)             : 35
dumps(data)            : 35
dumps(data, indent=2)  : 76
dumps(data, separators): 29

skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.

import json

data= [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]

try:
    print json.dumps(data)
except (TypeError, ValueError) as err:
    print 'ERROR:', err
print 
print json.dumps(data, skipkeys=True)

输出:

ERROR: keys must be a string

[{"a": "A", "c": 3.0, "b": [2, 4]}]

####让json支持自定义数据类型
以上例子都是基于python的built-in类型的,对于自定义类型的数据结构,json模块默认是没法处理的,会抛出异常:TypeError xx is not JSON serializable,此时你需要自定义一个转换函数:

import json  

class MyObj(object):
    def __init__(self, s):
        self.s = s
    def __repr__(self):
        return '<MyObj(%s)>' % self.s

obj = .MyObj('helloworld')

try:
    print json.dumps(obj)
except TypeError, err:
    print 'ERROR:', err

#转换函数
def convert_to_builtin_type(obj):
    print 'default(', repr(obj), ')'
    # 把MyObj对象转换成dict类型的对象
    d = { '__class__':obj.__class__.__name__, 
          '__module__':obj.__module__,
        }
    d.update(obj.__dict__)
    return d

print json.dumps(obj, default=convert_to_builtin_type)

输出:

ERROR: <MyObj(helloworld)> is not JSON serializable
default( <MyObj(helloworld)> )
{"s": "hellworld", "__module__": "MyObj", "__class__": "__main__"} 
#注意:这里的class和module根据你代码的所在文件位置不同而不同

相反,如果要把json decode 成python对象,同样也需要自定转换函数,传递给json.loads方法的object_hook参数:

#jsontest.py

import json

class MyObj(object):

    def __init__(self,s):
        self.s = s

    def __repr__(self):

        return "<MyObj(%s)>" % self.s

def dict_to_object(d):
    if '__class__' in d:
        class_name = d.pop('__class__')
        module_name = d.pop('__module__')
        module = __import__(module_name)

        print "MODULE:",module

        class_ = getattr(module,class_name)

        print "CLASS",class_

        args = dict((key.encode('ascii'),value) for key,value in d.items())

        print 'INSTANCE ARGS:',args

        inst = class_(**args)
    else:
        inst = d
    return inst

encoded_object = '[{"s":"helloworld","__module__":"jsontest","__class__":"MyObj"}]'

myobj_instance = json.loads(encoded_object,object_hook=dict_to_object)
print myobj_instance

输出:

MODULE: <module 'jsontest' from 'E:\Users\liuzhijun\workspace\python\jsontest.py'>
CLASS <class 'jsontest.MyObj'>
INSTANCE ARGS: {'s': u'helloworld'}
[<MyObj(helloworld)>]
MODULE: <module 'jsontest' from 'E:\Users\liuzhijun\workspace\python\jsontest.py'>
CLASS <class 'jsontest.MyObj'>
INSTANCE ARGS: {'s': u'helloworld'}
[<MyObj(helloworld)>]

####使用Encoder与Decoder类实现json编码的转换

JSONEncoder有一个迭代接口iterencode(data),返回一系列编码的数据,他的好处是可以方便的把逐个数据写到文件或网络流中,而不需要一次性就把数据读入内存.

import json

encoder = json.JSONEncoder()
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

for part in encoder.iterencode(data):
    print 'PART:', part

输出:

PART: [
PART: {
PART: "a"
PART: :
PART: "A"
PART: ,
PART: "c"
PART: :
PART: 3.0
PART: ,
PART: "b"
PART: :
PART: [2
PART: , 4
PART: ]
PART: }
PART: ]

encode方法等价于''.join(encoder.iterencode(),而且预先会做些错误检查(比如非字符串作为dict的key),对于自定义的对象,我们只需从些JSONEncoder的default()方法,其实现方式与上面提及的函数convet_to_builtin_type()是类似的。

import json
import json_myobj

class MyObj(object):

    def __init__(self,s):
        self.s = s

    def __repr__(self):
        return "<MyObj(%s)>" % self.s

class MyEncoder(json.JSONEncoder):
    
    def default(self, obj):
        print 'default(', repr(obj), ')'
        # Convert objects to a dictionary of their representation
        d = { '__class__':obj.__class__.__name__, 
              '__module__':obj.__module__,
              }
        d.update(obj.__dict__)
        return d

obj = json_myobj.MyObj('helloworld')
print obj
print MyEncoder().encode(obj)

输出:

<MyObj(internal data)>
default( <MyObj(internal data)> )
{"s": "helloworld", "__module__": "Myobj", "__class__": "MyObj"}

从json对Python对象的转换:

class MyDecoder(json.JSONDecoder):
    
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)

    def dict_to_object(self, d):
        if '__class__' in d:
            class_name = d.pop('__class__')
            module_name = d.pop('__module__')
            module = __import__(module_name)
            print 'MODULE:', module
            class_ = getattr(module, class_name)
            print 'CLASS:', class_
            args = dict( (key.encode('ascii'), value) for key, value in d.items())
            print 'INSTANCE ARGS:', args
            inst = class_(**args)
        else:
            inst = d
        return inst

encoded_object = '[{"s": "helloworld", "__module__": "jsontest", "__class__": "MyObj"}]'

myobj_instance = MyDecoder().decode(encoded_object)
print myobj_instance

输出:

MODULE: <module 'jsontest' from 'E:\Users\liuzhijun\workspace\python\jsontest.py'>
CLASS: <class 'jsontest.MyObj'>
INSTANCE ARGS: {'s': u'helloworld'}
[<MyObj(helloworld)>]

####json格式字符串写入到文件流中
上面的例子都是在内存中操作的,如果对于大数据,把他编码到一个类文件(file-like)中更合适,load()dump()方法就可以实现这样的功能。

import json
import tempfile

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]

f = tempfile.NamedTemporaryFile(mode='w+')
json.dump(data, f)
f.flush()

print open(f.name, 'r').read()

输出:

[{"a": "A", "c": 3.0, "b": [2, 4]}]

类似的:

import json
import tempfile

f = tempfile.NamedTemporaryFile(mode='w+')
f.write('[{"a": "A", "c": 3.0, "b": [2, 4]}]')
f.flush()
f.seek(0)

print json.load(f)

输出:

[{u'a': u'A', u'c': 3.0, u'b': [2, 4]}]

参考:
http://docs.python.org/2/library/json.html
http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html
http://pymotw.com/2/json/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化学习管理:Moodle和ONLYOFFICE文档编辑器的完美结合

目录 前言 一、什么是 Moodle 1、简单快速插入表单字段 3、免费表单模板库 4、开启无缝协作 三、在Moodle中集成ONLYOFFICE文档 四、在Moodle安装使用ONLYOFFICE 1、下载安装 2、配置服务器 3、在Moodle中使用ONLYOFFICE 文档活动 五、未来展望 写在最后 前言 在当今教育科技飞…

前端如何在30秒内实现吸管拾色器?

⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端react——实现浏览器页面的吸管拾色器功能。 背景&#xff1a; 在chrome web端快速实现一个页面的取色器功能&#xff0c; 分为两个场景 固定区域小范围取色当前页面取色 node系列往期文章 node_windows环境变量…

Vue3-win7搭建vue3环境

Vue3-win7搭建vue3环境 官方要求的信息是是node.js 18.03以上。而我的环境&#xff1a;win7 x64&#xff0c; vscode 1.34。 参考网址&#xff1a; 0、基本的安装 https://blog.csdn.net/m0_49139268/article/details/126159171 a、这里有各种安装包的下载路径&#xff08;镜…

手撕C++类和对象(中)

1.类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我 们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最 后两个取地址重载不…

[数据集][目标检测]管道漏水泄漏破损检测数据集VOC+YOLO格式2614张4类

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2614 标注数量(xml文件个数)&#xff1a;2614 标注数量(txt文件个数)&#xff1a;2614 标注…

10天速通Tkinter库——实践项目《植物杂交实验室》

一不小心就拖更了五天&#xff0c;私密马赛。但你们知道这五天我都是怎么过的吗&#xff0c;我起早贪黑&#xff08;起不来一点&#xff09;&#xff0c;每天勤勤恳恳撸代码&#xff0c;做设计&#xff08;谁家好人用ppt做设计哇&#xff09;&#xff0c;只为完成《植物杂交实验…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框&#xff0c;多种方式的逻辑&#xff0c;多种场景 原先通过实战总结&#xff0c;基本的知识推荐阅读&#xff1a; 详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#x…

【STM32单片机_(HAL库)】3-4-1【中断EXTI】【智能排队控制系统】LCD1602显示字符串

1.硬件 STM32单片机最小系统LCD1602显示模块 2.软件 驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "lcd1602.h"int main(void) {HAL_Init(); /* …

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…

使用 AMD GPUs 进行基于 Transformers 的时间序列预测

Using AMD GPUs for Enhanced Time Series Forecasting with Transformers — ROCm Blogs 时间序列预测&#xff08;TSF&#xff09;是信号处理、数据科学和机器学习&#xff08;ML&#xff09;等领域的关键概念。TSF 通过分析系统的过去时间模式来预测其未来行为&#xff0c;利…

私域流量升级下的新机遇——“开源 AI 智能名片S2B2C 商城小程序”与新兴技术的融合

摘要&#xff1a;本文深入探讨了随着私域流量应用的进一步升级&#xff0c;智能对话式营销持续火爆的同时&#xff0c;CEM&#xff08;客户体验管理&#xff09;、MA&#xff08;营销自动化&#xff09;、CDP&#xff08;客户数据平台&#xff09;及 DAM&#xff08;数据资产管…

《黑神话:悟空》之光线追踪技术

8月20日&#xff0c;国产单机游戏《黑神话&#xff1a;悟空》终于上市&#xff0c;并以实力演绎了爆款游戏的“盛况空前”。 这款游戏的成功&#xff0c;不仅源自对经典文学《西游记》的深刻解读与创新演绎&#xff0c;更在于其背后强大的科技力量支撑。 空间计算功不可没 土…

游戏服务器架构:基于匿名函数的高性能异步定时器系统

作者&#xff1a;码客&#xff08;ygluu 卢益贵&#xff09; 关键词&#xff1a;游戏服务器架构、匿名函数、高性能、异步定时器。 一、前言 本文主要介绍适用于MMO/RPG游戏服务端的、基于匿名函数做定时器回调函数的、高性能异步触发的定时器系统的设计方案&#xff0c;以解决…

《深入浅出WPF》读书笔记.7依赖属性和附加属性

《深入浅出WPF》读书笔记.7依赖属性和附加属性 背景 总结一下wpf依赖属性和附加属性的底层逻辑&#xff0c;方便更好的理解使用。 属性 CLR属性由来 static属性和非static属性的区别 static属性:对类有意义&#xff0c;内存只有一个实例&#xff1b; 非static属性:对类实…

WPF—LiveCharts图表

LiveCharts图表 LiveCharts是一个简单灵活、交互式以及功能强大的跨平台图表库&#xff0c;支持wpf、winform...应用程序。 快速入门 安装 在应用程序中右键引用​&#xff0c;点击管理NuGet程序包​&#xff0c;选择浏览​&#xff0c;搜索LiveChartsCore.SkiaSharpView.W…

自动驾驶-机器人-slam-定位面经和面试知识系列10之高频面试题(04)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网同号&#xff08;lonely-stone或者…

Cortex-A7的GIC(通用中断控制器):专有名词简介

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 专有名词简介 1.1 中断状态 说明&#xff1a; Inactive&#xff1a;未激活&#xff0c;中断无效。中断非挂起或非激活。 Pending&#xff1a;挂起&#xff0c;中断有效。等待…

【Web】NepCTF 2024题解

目录 PHP_MASTER!! NepDouble 蹦蹦炸弹&#xff08;boom_it&#xff09; NepRouter-白给 Always RCE First PHP_MASTER!! PHP反序列化键值逃逸mb_strpos与mb_substr连用导致的字符注入 https://www.cnblogs.com/EddieMurphy-blogs/p/18310518 flag在phpinfo里 payloa…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时&#xff0c;观察其输出。在逐渐增加均值次数后&#xff0c;噪声开始下降&#xff0c;达到一定程度后便停止下降&#xff0c;随着时间的推移&#xff0c;停止下降的噪声在逐渐增加&#xff0c;该部分主要是1/f噪声影响。 这种1/f噪声&#xff08;…

mPLUG-Owl3环境搭建推理测试

mPLUG-Owl3环境搭建&推理测试 引子 多模态的大模型也写了很多篇&#xff0c;阿里系的之前有一篇Qwen-VL的相关部署&#xff0c;感兴趣的童鞋请移步&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;。今天这个mPLUG-Qwl3&#xff0c;更新换代也很快&#x…