开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 简单的json

Pythonsimplejson教程展示了如何使用Pythonsimplejson模块读取和写入JSON数据。

JSON

JSON(JavaScript对象表示法)是一种轻量级数据交换格式。它很容易被人类阅读和编写,并被机器解析和生成。application/json是JSON的官方互联网媒体类型。JSON文件扩展名为.json

simplejson模块

simplejson是一个简单、快速、完整且可扩展的JSON编码器,适用于Python2.5+和Python3.3+。它是没有依赖项的纯Python代码。

simplejson模块包含在现代Python版本中。解码器可以处理任何指定编码(默认为UTF-8)的传入JSON字符串

使用simplejson

import json

要使用simplejson模块,我们导入json

Simplejson转换表

下表显示了数据类型如何在Python和JSON之间转换。

Python JSON
dict,namedtuple 对象
列表、元组 数组
str、unicode 字符串
整型、长型、浮点型 数字
True
null

json.dump()

json.dump方法将Python对象作为JSON格式的流序列化为文件对象。

#!/usr/bin/python

import json

data = {"name": "Jane", "age": 17}

with open('friends.json', 'w') as f:
    
    json.dump(data, f)

该示例使用json.dump方法将Python字典序列化为JSON。JSON数据写入friends.json文件。

$ cat friends.json 
{"age": 17, "name": "Jane"}

执行脚本后,我们得到了这些数据。

json.dumps()

json.dumps方法将Python对象序列化为JSON字符串。

#!/usr/bin/python

import json

data = [{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]

json_data = json.dumps(data)
print(repr(json_data))

该示例使用json.dumps方法将Python列表序列化为JSON字符串。JSON数据打印到控制台。

$ ./simplejson_dumps.py 
'[{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]'

json.load()

json.load方法将包含JSON文档的文件对象反序列化为Python对象。

{
  "theme" : "bluespring",
  "size": "small",
  "splashscreen": "false"
}

config.json文件包含此数据。

#!/usr/bin/python

import json

with open('config.json') as f:

    config = json.load(f)
    
    print('Theme: {}'.format(config['theme']))
    print('Size: {}'.format(config['size']))
    print('Splash screen: {}'.format(config['splashscreen']))

该示例使用json.loadconfig.json文件中读取配置数据,并将数据打印到终端。

$ ./read_config.py 
Theme: bluespring
Size: small
Splash screen: false

json.loads()

json.loads方法将JSON字符串反序列化为Python对象。

#!/usr/bin/python

import json

json_data = '{"name": "Jane", "age": 17}'

data = json.loads(json_data)

print(type(json_data))
print(type(data))

print(data)

该示例将JSON字符串反序列化为Python字典

$ ./simple.py 
<class 'str'>
<class 'dict'>
{'name': 'Jane', 'age': 17}

Simplejson从URL读取JSON

以下示例从网页读取JSON数据。我们从http://time.jsontest.com获取JSON数据。

$ curl http://time.jsontest.com
{
   "time": "10:00:19 AM",
   "milliseconds_since_epoch": 1496311219347,
   "date": "06-01-2017"
}

对此站点的GET请求返回此JSON字符串。

#!/usr/bin/python

import json
import urllib.request

hres = urllib.request.urlopen('http://time.jsontest.com')

data = json.loads(hres.read().decode("utf-8"))

print('Unix time: {}'.format(data['milliseconds_since_epoch']))
print('Time: {}'.format(data['time']))
print('Date: {}'.format(data['date']))

在示例中,我们使用urllib.request模块来创建对网站的请求。

data = json.loads(hres.read().decode("utf-8"))

从返回的响应中,我们使用json.loads方法将JSON字符串转换为Python字典。

print('Unix time: {}'.format(data['milliseconds_since_epoch']))
print('Time: {}'.format(data['time']))
print('Date: {}'.format(data['date']))

借助于Python的format方法,我们将检索到的数据打印到控制台。

$ ./parse_json_url.py 
Unix time: 1496311518866
Time: 10:05:18 AM
Date: 06-01-2017

漂亮的打印

使用simplejson,我们可以轻松漂亮地打印我们的数据。

#!/usr/bin/python

import json

json_data = {"name":"Audi", "model":"2012", "price":22000, 
                 "colours":["gray", "red", "white"]}

data = json.dumps(json_data, sort_keys=True, indent=4 * ' ')

print(data)

使用sort_keysindent选项,我们可以很好地格式化JSON数据。

$ ./pretty_print_json.py 
{
    "colours": [
        "gray",
        "red",
        "white"
    ],
    "model": "2012",
    "name": "Audi",
    "price": 22000
}

这是示例的输出。数据缩进,键排序。

Simplejson自定义类

Simplejson只序列化和反序列化转换表中列出的几个Python对象。对于自定义Python对象,我们需要执行一些额外的步骤。

#!/usr/bin/python

import json

class Person(object):
    
    def __init__(self, name, age):
    
        self.name = name
        self.age = age
        
p = Person("Lucy", 23) 

json_data = json.dumps(p.__dict__)

print(repr(json_data))

在此示例中,我们将自定义对象序列化为JSON。

json_data = json.dumps(p.__dict__)

诀窍是使用__dict__属性,它存储对象属性(姓名和年龄)。

$ ./custom_class.py 
'{"name": "Lucy", "age": 23}'

自定义类的Simplejson列表

在下一个示例中,我们将展示如何序列化自定义类列表。

#!/usr/bin/python

import json

class Person(object):
    
    def __init__(self, name, age):
    
        self.name = name
        self.age = age
        
    def toJson(self):
        '''
        Serialize the object custom object
        '''
        return json.dumps(self, default=lambda o: o.__dict__, 
                sort_keys=True, indent=4)            

p1 = Person("Lucy", 23) 
p2 = Person("Thomas", 29)

people = []
people.append(json.loads(p1.toJson()))
people.append(json.loads(p2.toJson()))

json_data = json.dumps(people)

print(repr(json_data))

我们已经创建了一个序列化对象的toJson方法。

people = []
people.append(json.loads(p1.toJson()))
people.append(json.loads(p2.toJson()))

将对象添加到列表时调用toJson方法。

$ ./custom_class_list.py 
'[{"age": 23, "name": "Lucy"}, {"age": 29, "name": "Thomas"}]'

在本教程中,我们使用了Pythonsimplejson库。

列出所有Python教程。

未经允许不得转载:我爱分享网 » Python 简单的json

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏