Python Json使用,Json库性能测试

介绍

官网:https://www.json.org/json-zh.html

中文介绍:https://www.json.cn/wiki.html

中文介绍:https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/JSON

JavaScript对象表示法(JSON)是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。您会经常遇到它,所以在本文中,我们向您提供使用JavaScript处理JSON的所有工作,包括访问JSON对象中的数据项并编写自己的JSON。

什么是 JSON

JSON是一种按照JavaScript对象语法的数据格式,这是 Douglas Crockford 推广的。虽然它是基于 JavaScript 语法,但它独立于JavaScript,这也是为什么许多程序环境能够读取(解读)和生成 JSON。

JSON可以作为一个对象或者字符串存在,前者用于解读 JSON 中的数据,后者用于通过网络传输 JSON 数据。 这不是一个大事件——JavaScript 提供一个全局的 可访问的 JSON 对象来对这两种数据进行转换。

一个 JSON 对象可以被储存在它自己的文件中,这基本上就是一个文本文件,扩展名为 .json, 还有 MIME type 用于 application/json.

JSON 结构

我们已经可以推测出 JSON 对象就是基于 JavaScript 对象,而且这几乎是正确的。您可以把 JavaScript 对象原原本本的写入 JSON 数据——字符串,数字,数组,布尔还有其它的字面值对象。这允许您构造出一个对象树,如下:

{
  "squadName" : "Super hero squad",
  "homeTown" : "Metro City",
  "formed" : 2016,
  "secretBase" : "Super tower",
  "active" : true,
  "members" : [
    {
      "name" : "Molecule Man",
      "age" : 29,
      "secretIdentity" : "Dan Jukes",
      "powers" : [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    },
    {
      "name" : "Madame Uppercut",
      "age" : 39,
      "secretIdentity" : "Jane Wilson",
      "powers" : [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name" : "Eternal Flame",
      "age" : 1000000,
      "secretIdentity" : "Unknown",
      "powers" : [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
}

如果我们要加载对象进入 JavaScript 程序,以保存为一个名为 superHeroes 对象为例,我们使用 . 或 [] 访问对象内的数据(关于. 和 []概念,见 对象基础 )。如:

superHeroes.hometown
superHeroes["active"]

为了访问对象中的对象,您只需简单地链式访问(通过属性名和数组索引)。例如,访问 superHeroes 对象中的 members 数组对象的第二个元素的 powers 数组对象的第三个元素,您可以这样做:

superHeroes["members"][1]["powers"][2]
  1. 首先我们有变量名 superHeroes,储存对象 。
  2. 在对象中我们想访问 members 属性,所以我们使用 [“members”]。
  3. members 包含有对象数组,我们想要访问第二个元素,所以我们使用[1]。
  4. 在对象内,我们想访问 powers 属性,所以我们使用 [“powers”]。
  5. powers 属性是一个包含英雄技能的数组。我们想要第三个,所以我们使用[2]。

注:我们已经在 JSONText.html 实例中让JSON 对象进入变量中使其可访问(见源代码)。尝试加载它并且在您的浏览器上访问对象数据。

JSON 数组

前面我们已经说过,”我们已经可以推测出 JSON 对象就是基于 JavaScript 对象,而且这几乎是正确的“——我们说几乎正确的原因是数组对象也是一种合法的 JSON 对象,例如:

[
  {
    "name" : "Molecule Man",
    "age" : 29,
    "secretIdentity" : "Dan Jukes",
    "powers" : [
      "Radiation resistance",
      "Turning tiny",
      "Radiation blast"
    ]
  },
  {
    "name" : "Madame Uppercut",
    "age" : 39,
    "secretIdentity" : "Jane Wilson",
    "powers" : [
      "Million tonne punch",
      "Damage resistance",
      "Superhuman reflexes"
    ]
  }
]

上面是完全合法的 JSON。您只需要通过数组索引就可以访问数组元素,如[0][“powers”][0]。

其他注意事项
  • JSON 是一种纯数据格式,它只包含属性,没有方法。
  • JSON要求在字符串和属性名称周围使用双引号。 单引号无效。
  • 甚至一个错位的逗号或分号就可以导致 JSON 文件出错。您应该小心的检查您想使用的数据(虽然计算机生成的 JSON 很少出错,只要生成程序正常工作)。您可以通过像 JSONLint 的应用程序来检验 JSON。
  • JSON 可以将任何标准合法的 JSON 数据格式化保存,不只是数组和对象。比如,一个单一的字符串或者数字可以是合法的 JSON 对象。虽然不是特别有用处……
  • 与 JavaScript 代码中对象属性可以不加引号不同,JSON 中只有带引号的字符串可以用作属性。

用法

功能jsonsimplejsonujsonorjsonrapidjson
dumps
loads
dump×
load×
函数说明
dumps将数据进行json格式编码
loads将json格式转换为python数据格式
dump将数据格式化为json写入文件
load从文件中读取json格式数据转换为python数据格式
json
dumps
s = {"a":1}
print(json.dumps(s), type(json.dumps(s)))

结果

{"a":1} <class 'str'>

loads
s = json.dumps({"a":1})
print(json.loads(s), type(json.loads(s)))

结果

{'a': 1} <class 'dict'>
dump
s = {"a":1}
with open('test.json', 'w') as f:
    json.dump(s,f)

结果

cat test.json
{"a": 1}

load
s = {"a":1}
with open('test.json', 'r') as f:
    print(json.load(f))

结果

{'a': 1}

ujson
dumps
s = [{"key": "value"}, 81, True]
print(ujson.dumps(s), type(ujson.dumps(s)))

结果

[{"key":"value"},81,true] <class 'str'>
loads
s = ujson.dumps([{"key": "value"}, 81, True])
print(ujson.loads(s), type(ujson.loads(s)))

结果

[{'key': 'value'}, 81, True] <class 'list'>
dump
s = [{"key": "value"}, 81, True]

with open('test.json', 'w') as f:
    json.dump(s, f)

结果

# cat test.json
[{"key": "value"}, 81, true]
load
with open('test.json', 'r') as f:
    print(json.load(f))

结果

[{'key': 'value'}, 81, True]

性能测试

Python 3.7.9
orjson 3.4.3
rapidjson 0.9.3
simplejson 3.17.2
ujson 4.0.1

dumps测试代码
# test.py
from time import time
import sys
import string

num = int(sys.argv[1])
libs = ['ujson','rapidjson','orjson','simplejson', 'json']
items = []
for i in range(num):
    items.append({c:c for c in string.ascii_letters})

for lib in libs:
    if lib == 'ujson':
        import ujson
        start = time()
        ujson.dumps(items)
        print("{} {} {}".format(lib, num, time() - start))
        
    elif lib == 'rapidjson':
        import rapidjson
        start = time()
        rapidjson.dumps(items)
        print("{} {} {}".format(lib, num, time() - start))
        
    elif lib == 'orjson':
        import orjson
        start = time()
        orjson.dumps(items)
        print("{} {} {}".format(lib, num, time() - start))
        
    elif lib == 'simplejson':
        import simplejson
        start = time()
        simplejson.dumps(items)
        print("{} {} {}".format(lib, num, time() - start))
        
    else:
        import json
        start = time()
        json.dumps(items)
        print("{} {} {}".format(lib, num, time() - start))
python test.py 100|1000|10000|100000|1000000
字符1001000100001000001000000
ujson0.00099754333496093750.0039892196655273440.055822849273681640.54115128517150885.374091625213623
rapidjson0.00099658966064453120.00299358367919921880.0329444408416748050.38644480705261233.823469400405884
orjson0.00.00099492073059082030.022937059402465820.2080523967742922.0567736625671387
simplejson0.0009973049163818360.0119950771331787110.111701488494873051.02690482139587411.177719116210938
json0.00102734565734863280.0129690170288085940.1266620159149171.24731421470642114.103604078292847
loads测试代码
# test.py
# test.py
from time import time
import sys
import string
import orjson

num = int(sys.argv[1])
libs = ['ujson', 'rapidjson', 'orjson', 'simplejson', 'nujson', 'json']
items = []
for i in range(num):
    items.append({c: c for c in string.ascii_letters})
items = orjson.dumps(items)

for lib in libs:
    if lib == 'ujson':
        import ujson
        start = time()
        ujson.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

    elif lib == 'rapidjson':
        import rapidjson
        start = time()
        rapidjson.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

    elif lib == 'orjson':
        import orjson
        start = time()
        orjson.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

    elif lib == 'simplejson':
        import simplejson
        start = time()
        simplejson.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

    elif lib == 'nujson':
        import nujson
        start = time()
        nujson.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

    else:
        import json
        start = time()
        json.loads(items)
        print("{} {} {}".format(lib, num, time() - start))

python test.py 100|1000|10000|100000|1000000
字符1001000100001000001000000
ujson0.0054142475128173830.0054142475128173830.053854465484619140.54551744461059575.4679648876190186
rapidjson0.0080056190490722660.0080056190490722660.098736763000488280.9524536132812510.33743929862976
orjson0.0119817256927490230.0119817256927490230.137631177902221681.351381063461303713.812097549438477
simplejson0.0070157051086425780.0070157051086425780.079812288284301760.76610589027404798.075462579727173
nujson0.0059618949890136720.0059618949890136720.0558311939239501950.54053092002868655.714277744293213
json0.0069792270660400390.0069792270660400390.082810878753662110.77546715736389167.8442223072052
小结
  • dumps:从速度上来说orjson库最快
  • loads:从速度上来说,nujson库最快,其次ujson,然后内置的json库
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pythonjson是用于处理JSON数据的标准。它提供了一组函数和方法,用于将Python对象编码为JSON字符串,或将JSON字符串解码为Python对象。下面是json的一些常用方法: 1. 将Python对象编码为JSON字符串:使用`json.dumps()`方法可以将Python对象编码为JSON字符串。例如: ```python import json data = { "name": "John", "age": 30, "city": "New York" } json_str = json.dumps(data) print(json_str) ``` 输出: ``` {"name": "John", "age": 30, "city": "New York"} ``` 2. 将JSON字符串解码为Python对象:使用`json.loads()`方法可以将JSON字符串解码为Python对象。例如: ```python import json json_str = '{"name": "John", "age": 30, "city": "New York"}' data = json.loads(json_str) print(type(data)) print(data) ``` 输出: ``` <class 'dict'> {'name': 'John', 'age': 30, 'city': 'New York'} ``` 3. 将Python对象编码为JSON数据并写入文件:使用`json.dump()`方法可以将Python对象编码为JSON数据,并将其写入文件中。例如: ```python import json data = { "name": "John", "age": 30, "city": "New York" } with open("data.json", "w") as f: json.dump(data, f) ``` 4. 从JSON文件中读取数据并解码为Python对象:使用`json.load()`方法可以从JSON文件中读取数据,并将其解码为Python对象。例如: ```python import json with open("data.json", "r") as f: data = json.load(f) print(type(data)) print(data) ``` 输出: ``` <class 'dict'> {'name': 'John', 'age': 30, 'city': 'New York'} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值