JSON介绍

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

引用自json.org

语法

结构

JSON只提供了两种结构——字典和数组。也就是说,JSON可以存储一对一或者一对多的键值对关系。

形式

对象

对象是一个无序的键值对集合。 一个对象以{开始,}结束。每个后跟一个:;键值对之间使用,分隔。 object

数组

数组是值的有序集合,一个键可以对应一个数组。 一个数组以[开始,]结束。值之间使用,分隔。 array

值可以是双引号括起来的字符串、数值、true、false、 null、对象或者数组。这些结构可以嵌套。 value

字符串

字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符即一个单独的字符串。 字符串与C/C++中的字符串非常相似,包括常见的各种转义符号。 value

数值

数值与C/C++中的数值非常相似,但没有八进制和十六进制格式。 number

空白

空白符号(包括空格,Tab以及回车)可以加入到任何符号之间,不会影响JSON的含义

Python中的JSON库

以Python 3为基准

编码

对应类型

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

函数

我们使用JSON库中的dump以及dumps函数来进行JSON编码。dumpdumps各项参数含义基本一致,唯一区别在于dump函数编码产生一个JSON文件流,而dumps编码产生一个JSON字符串。

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
  • obj:编码对象
  • fp:指定文件流
  • skipkeys:若skipkeys为真,则非标准类型将会跳过;否则返回TypeError
  • ensure_ascii:若ensure_ascii为真,则输出时将会确保没有非ASCII字符;否则将会原样输出
  • check_circular:若check_circular为真,则将会检测是否存在循环调用;否则会跳过检测
  • allow_nan:若allow_nan为真,则将会允许存在空值(无穷大值);否则会返回ValueError
  • cls:若cls为空值,则使用JSONEncoder;否则使用指定子类进行编码
  • indent:若indent为空值,则无缩进;否则使用指定值进行缩进
  • separators:若separators为空值,则使用(',', ': ')分隔;否则使用指定的元组进行分隔
  • default:若default为空值,则使用自带的default方法;否则使用指定值
  • sort_keys:若sort_keys为真,则输出将会按照键进行排序

示范

>>> import json

>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'

# 排序
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}

# 分隔符
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'

# Unicode输出
>>> json.dumps("\u5317\u4eac", ensure_ascii=False)
'北京'

解码

对应类型

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone

函数

我们使用JSON库中的load以及loads函数来进行JSON解码。loadloads各项参数含义基本一致,唯一区别在于load函数用于解码JSON文件流,而loads用于解码JSON字符串。

json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
  • fp:指定文件流
  • s:指定字符串
  • encoding:指定字符串编码
  • cls:若cls为空值,则使用JSONEncoder;否则使用指定子类进行编码
  • object_hook:若object_hook为空值,对象则返回解码器dict;否则使用自定义类型返回
  • parse_float:若parse_float为空,则JSON浮点数转换为浮点数;否则转换为指定类型
  • parse_int:若parse_int为空,则JSON整数转换为整数;否则转换为指定类型
  • parse_constantparse_constant为空,则不会处理非法输入;否则抛出异常
  • object_pairs_hook:若object_pairs_hook为空值,则数组返回解码器dict;否则使用自定义类型返回

示范

>>> import json

>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]

更新日志

  • 2015年10月30日 初步完成