JSON数据序列化与反序列化实战

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

一、关于JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.是一种文件规范,绝大多数的编程语言均可以轻松读写.当然python也不例外.
本文要讲的主要是python对JSON数据的序列化和反序列化.所谓序列化就是写入到文件,反序列化就是从文件中写读到到程序中成为对应语言的数据类型.
python数据类型与JSON格式的对照表:

Python JSON
dict object
list,tuple array
str,unicode string
int,long,float number
True true
False false
None null

二、python中json库与函数

python通过导入json库:import json 来解析操作与序列化JSON格式文件.
主要通过两个函数
json.dumps是将dict转化成str格式,json.loads是将str转化成dict格式。这一对是用来做编码或叫解析与反解析JSON数据.注意这里没有写入文件的功能,只是在python内部处理.因此这里我习惯叫做解析与反解析.
代码:

import json
a = {'name': 'san', 'age': 29}
b = json.dumps(a)
print(b, type(b))
print("********分割线**********")
print(json.loads(b),type(json.loads(b)))

输出结果:
JSON数据序列化与反序列化实战
json.dump和json.load也是类似的功能,但是这两个函数需要文件对象结合操作。即序列化( Serialize)与反序列化(Deserialize)
通过查看这对函数的帮助说明文档如下:

**Help on function dump in module json:**

dump(obj, fp, 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`` as a JSON formatted stream to ``fp`` (a
    ``.write()``-supporting file-like object).

**Help on function load in module json:**

load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
   ** Deserialize **``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object.

整明白了概念和常用的函数,接下来我们来看一个实例.

三、python对JSON序列化与反序列化实战

以下是JSON格式的文件(游戏配置文件)
内容大致如下:

[
        {
                "phyId": 0,
                "zoneId": 0,
                "loadStatus": 0,
                "isPublic": false,
                "nameId": "user"
        },
        {
                "phyId": 0,
                "zoneId": 0,
                "loadStatus": 3,
                "isPublic": false,
                "nameId": "misc"
        },
        {
                "chName": "乱世枭雄",
                "tag": "hunfu,ios",
                "phyId": 1,
                "zoneId": 1,
                "localIP": "192.168.100.168",
                "loadStatus": 3,
                "url": [
                        "http://10.247.12.92/zhmjServer/"
                ],
                "isPublic": true,
                "nameId": "10001"
        },
        {
                "chName": "倾国倾城",
                "tag": "hunfu,ios",
                "phyId": 1,
                "zoneId": 2,
                "localIP": "192.168.100.168",
                "loadStatus": 3,
                "url": [
                        "http://10.247.12.92/zhmjServer/"
                ],
                "isPublic": true,
                "nameId": "10012"
        }
]

反序列化,从以下game.json中读取配置信息
代码:

#coding:utf-8
import json

with open("game.json") as game_info:
    games = json.load(game_info, encoding="utf-8")
for i in games:
    print(i)

运行结果:
JSON数据序列化与反序列化实战

序列化:
向game.json中更新写入JSON格式流或叫更新JSON文件
例如向game.json中新增加一条游戏服配置:
所谓更新思路就是把原有的数据反解析反序列化读出,再添加新的数据,解析序列化写回文件.

def bakSrv(NameId="",GameName="",zoneId=""):
    localIP='192.168.100.168'
    tag = 'hunfu,ios'
    url = ['http://10.247.12.92/zhmjServer/']
    GameSrv = {}
    with open("game.json") as game_info:
        old_games = json.load(game_info,encoding="utf-8")
        GameSrv["localIP"] = u"%s" % localIP
        GameSrv["tag"] = u"%s" % tag
        GameSrv["url"] = url
        GameSrv["phyId"] = 1
        GameSrv["nameId"] = str(NameId)
        GameSrv["chName"] = u"%s" % GameName
        GameSrv["isPublic"] = False
        GameSrv["zoneId"] = int(zoneId)
        GameSrv["loadStatus"] = 0
        old_games.append(GameSrv)
        repr(old_games)

    f = open("game.json",'w+')       #创建写入文件对象
    json.dump(old_games, f,ensure_ascii=False,indent=4,separators=(',',': ')) #
    f.close()
    print("***************生成新的JSON配置文件成功!****************************")

bakSrv(NameId="10003",GameName="新测试服",zoneId=4)

说明:
json.dump的参数:
注意,此处是dump函数的参数,indent是json文件生成后的缩进,默认None则输出的格式是在一行,很不美观,separators默认可不指定,可以修改成类似separators=(',\n',': \t') 如此就是加了:后的tab, ennsure_ascii默认是True 如果不修改成False你的中文是unicode的,所以这里必须指定.

此时查看game.json文件时会发现已经新增加了一条,如图:
JSON数据序列化与反序列化实战

四、总结

通过需要从一个JSON格式文件中load读出反序列化并通过dump生成或修改重新写入序列化到一个JSON格式的文件中.而loads与dumps主要是python内部进行解析.最终要写入到文件需要dump.或从文件中读取用load.
用错了地方则会出错.










本文转自 dyc2005 51CTO博客,原文链接:http://blog.51cto.com/dyc2005/2052451,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
53 7
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
44 4
|
1月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
47 3
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON JavaScript 前端开发
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
51 1
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
178 0
在Java中处理JSON数据:Jackson与Gson库比较