项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.json是什么

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。json最大的优势就是独立于编程语言, 易于人阅读和编写,同时也易于机器解析和生成。所以,如果我们需要在不同的编程语言之间传递对象,或者需要在网络世界中传输数据,我们都可以将数据序列化为json格式。当将其序列化为json格式以后,可以方便地被所有编程语言读取与解析,也可以方便地被存储在磁盘中或者用于网络传输。正因为有这些优点,json在实际中使用非常广泛。

JSON构建于两种结构:
1.“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

2.python数据类型与json数据类型的映射关系

Python类型 JSON类型
dict \hspace{1.3cm} {}
list \hspace{1.5cm} []
str(unicode) \hspace{0.5cm} string
int(float,long) \hspace{0.3cm}number
True(False) \hspace{0.7cm} true(false)
None \hspace{1.7cm} null

3.python中json模块的简单用法

python中内置的json模块就可以完成从python对象到json格式数据的转换。
先来看看怎么把一个python对象变为一个json串:

>>> import json
>>> dic = dict(name='James',age=18)
>>> dic_to_str = json.dumps(dic)
>>> dic_to_str
'{"age": 18, "name": "James"}'
>>> type(dic_to_str)
<type 'str'>

通过dumps方法,就把一个dict变为了一个json串,返回的是一个str对象。dumps方法相当于一个encoding过程,是对简单数据类型的编码。也可以理解是对python对象的一个序列化的过程。

接下来看看如何把一个json串变为一个python对象:

>>> str_to_dic = json.loads(dic_to_str)
>>> str_to_dic
{u'age': 18, u'name': u'James'}
>>> type(str_to_dic)
<type 'dict'>

同理通过loads方法,将一个json串,变为了一个dict对象,返回的是一个dict。loads方法相当于是一个decoding过程,是对字符串的一个解码。当然也可以理解为是对python对象的反序列化!

4.将自己的类转成json串

前面我们看了怎样将python中的内置dict对象转化为json串的过程。在很多时候,我们希望将自己定义的类也转化为json串。比如我们自己定义了person类,并且希望将其序列化为json串:

#!/usr/bin/env python
#coding:utf-8import jsonclass Person(object):def __init__(self,name,age):self.name = nameself.age = ageperson = Person("James",18)
print (json.dumps(person))

将上面的代码run起来以后,会有以下错误:

Traceback (most recent call last):File "./person.py", line 13, in <module>print (json.dumps(person))File "/Users/lei.wang/anaconda/lib/python2.7/json/__init__.py", line 244, in dumpsreturn _default_encoder.encode(obj)File "/Users/lei.wang/anaconda/lib/python2.7/json/encoder.py", line 207, in encodechunks = self.iterencode(o, _one_shot=True)File "/Users/lei.wang/anaconda/lib/python2.7/json/encoder.py", line 270, in iterencodereturn _iterencode(o, 0)File "/Users/lei.wang/anaconda/lib/python2.7/json/encoder.py", line 184, in defaultraise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Person object at 0x101a00090> is not JSON serializable

很明显可以看出,是我们无法将person对象序列化!
我们再仔细观察一下dumps()方法:

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)Serialize obj to a JSON formatted str using this conversion table. If ensure_ascii is false, the result may contain non-ASCII characters and the return value may be a unicode instance.

参数default选项就是将一个对象变为一个可序列化的Json对象。前面的Person类就是因为没有指定default选项,所以无法序列化。现在我们为Person类写一个专门的序列化方法:

!/usr/bin/env python
#coding:utf-8import jsonclass Person(object):def __init__(self,name,age):self.name = nameself.age = agedef person_to_dict(person):return {'name': person.name,'age':  person.age}person = Person("James",18)
print json.dumps(person,default = person_to_dict)

将代码运行起来:

{"age": 18, "name": "James"}

上面这么做的目的,就是通过person_to_dict方法,将person对象转化为dict对象,然后通过将default选项设置为person_to_dict,就可以使用dumps方法将person对象序列化为json对象了!

当然,如果我们想偷点懒,也是可以的。可以不写person_to_dict方法,直接调用person类的__dict__方法:

!/usr/bin/env python
#coding:utf-8import jsonclass Person(object):def __init__(self,name,age):self.name = nameself.age = agedef person_to_dict(person):return {'name': person.name,'age':  person.age}person = Person("James",18)
print json.dumps(person,default = lambda obj:obj.__dict__)
print json.dumps(person,default = person_to_dict)

让代码run起来:

{"age": 18, "name": "James"}
{"age": 18, "name": "James"}

由此可见,print两行代码的效果是一致的!

同样的道理,既然能将自己定义的类转化为json串,同理也能将json串变为类。我们先看看loads方法:

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
Deserialize s (a str or unicode instance containing a JSON document) to a Python object using this conversion table.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).

仿照上面的思路:

#!/usr/bin/env python
#coding:utf-8import jsonclass Person(object):def __init__(self,name,age):self.name = nameself.age = agedef dic_to_person(dic):return Person(dic['name'],dic['age'])json_person = '{"name":"James","age":18}'
print json.loads(json_person,object_hook = dic_to_person)

让代码run起来:

<__main__.Person object at 0x1022071d0>

由此可见,我们通过loads方法,达到了将json字符串反序列化为Person对象的目的!

python json详解相关推荐

  1. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  2. Python|SQL详解之DDL|DML|DQL|DCL|索引|视图、函数和过程|JSON类型|窗口函数|接入MySQL|清屏|正则表达式|executemany|语言基础50课:学习(14)

    文章目录 系列目录 原项目地址 第41课:SQL详解之DDL 建库建表 删除表和修改表 第42课:SQL详解之DML insert操作 delete 操作 update 操作 完整的数据 第43课:S ...

  3. Python数据分析详解

    Python数据分析详解 数据分析概述 python在数据分析方面有哪些优势 Python不受数据规模的约束,能够处理大规模数据. Python的sklearn库提供了丰富的数据挖掘和人工智能方法,为 ...

  4. 【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职 ...

  5. python区块链开发_Fabric区块链Python开发详解

    Hyperledger Fabric是最流行的联盟区块链平台.Fabric区块链Python开发详解课程 涵盖Fabric区块链的核心概念.Fabric网络搭建.Node链码开发.Python应用开发 ...

  6. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  7. 【python】详解类class的继承、__init__初始化、super方法

    原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_medium=distribute.pc_relevant ...

  8. python与golang_Golang与python线程详解及简单实例

    Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var ...

  9. C# - JSON详解

    C# - JSON详解 转载于:https://www.cnblogs.com/macT/p/10214396.html

  10. python 最小二乘法_最小二乘法及其python实现详解

    最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得 ...

最新文章

  1. Cocos2d-X中实现菜单特效
  2. state.sls与state.highstate区别
  3. 思科、华为、Juniper命令对比
  4. VTK:图表之VisualizeDirectedGraph
  5. 公厕的门下面为什么都要空一截?难道是为了和别人分享我中午吃的两碗螺狮粉?
  6. mysql去重操作哪个最快_如何将 MySQL 去重操作优化到极致?| CSDN 博文精选
  7. shell训练营Day27
  8. Perl中删除或替换字符串中特殊字符(如空格)的方法
  9. windows 域名+虚拟目录 (php)
  10. 毕设——社区志愿者信息管理系统
  11. 鸿蒙系统微信红包,微信红包王版app下载-最新微信红包王版下载-安卓苹果鸿蒙版-155175软件...
  12. 小学生认识计算机网络教案,小学信息技术四年级教案
  13. 【先锋】永洪科技何春涛:不忘初心,砥砺前行
  14. Primeng修改组件样式
  15. matlab程序 直线插补,无聊写matlab仿真直线插补算法
  16. 详细设计-程序结构图
  17. 5个方法将不带www的根域名301重定向到www主域名
  18. 阳光保险港交所上市:年营收1200亿 市值超600亿港元
  19. #ncbi #blast
  20. python批处理原始核磁数据用于DPABI

热门文章

  1. 记一些关于acm的小知识(自用,粗糙,勿点呀)
  2. Vue.js 系列教程 5:动画
  3. 一dubbo框架学前原理介绍
  4. 2015年度夏季假期学习内容
  5. 编写自己的tomcat, 并运行tomcat源码于eclipse中
  6. jbpm5.1介绍(7)
  7. 高并发架构消息队列面试题解析
  8. 13.15. ftp fs
  9. linux 编写脚本按小时删除日志
  10. $provide.decorator