当前位置: 首页 > news >正文

python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

python之simplejson,Python版的简单、 快速、 可扩展 JSON 编码器/解码器

simplejson

Python版的简单、 快速、 可扩展 JSON 编码器/解码器

编码基本的 Python 对象层次结构:

复制代码
import simplejson as json

print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) print json.dumps("\"foo\bar") print json.dumps(u'\u1234') print json.dumps('\\') print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) from StringIO import StringIO io = StringIO() json.dump(['streaming API'], io) io.getvalue()
复制代码
["foo", {"bar": ["baz", null, 1.0, 2]}] "\"foo\bar" "\u1234" "\\" {"a": 0, "b": 0, "c": 0}

 压缩编码(减少空格来节省数据传输量):

import simplejson as json
print json.dumps([1  ,  2,    3,{'4': 5, '6': 7}], separators=(',', ':'))
[1,2,3,{"4":5,"6":7}]

漂亮的输出(输出效果好看易读,但是增加了很多空格,数据量变大):

import simplejson as json
s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4 * ' ') print s 
{
    "4": 5,
    "6": 7 }

解码 JSON:

复制代码
import simplejson as json
print json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') print json.loads('"\\"foo\\bar"') from StringIO import StringIO io = StringIO('["streaming API"]') print json.load(io)[0] 
复制代码
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}] "fooar streaming API

使用Decimal代替float类型:

复制代码
import simplejson as json
from decimal import Decimal
print json.loads('1.1', use_decimal=True) == Decimal('1.1') print json.dumps(Decimal('1.1'), use_decimal=True) == '1.1'

  True
  True

 
复制代码

json对象的解码成python对象:

复制代码
import simplejson as json
def as_complex(dct):
    if '__complex__' in dct: return complex(dct['real'], dct['imag']) return dct print json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
复制代码
(1+2j)

把python的对象json编码传输的json格式:

复制代码
import simplejson as json
def encode_complex(obj):
    if isinstance(obj, complex): return [obj.real, obj.imag] raise TypeError(repr(o) + " is not JSON serializable") print json.dumps(2 + 1j, default=encode_complex) print json.JSONEncoder(default=encode_complex).encode(2 + 1j) print ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
复制代码
[2.0, 1.0]
[2.0, 1.0]
[2.0, 1.0]

 基本用法:

复制代码
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        encoding='utf-8', default=None, use_decimal=True, namedtuple_as_object=True, tuple_as_array=True, bigint_as_string=False, sort_keys=False, item_sort_key=None, **kw):
复制代码

将 obj 序列化为 JSON 格式流到 fp (.write ()-支持类似于文件的对象)。

 如果 skipkeys 为 true (默认: False),然后词典并不是一种基本类型的键 (str,unicode、 int,长、 浮动、 bool,None) 将被跳过而不是引发 TypeError。

如果 ensure_ascii 为 false (默认: True),然后写入 fp 一些块可能是 unicode 的情况下,除正常 Python str unicode 胁迫规则。除非 fp.write() 明确地理解 unicode (如 codecs.getwriter()) 这是可能会导致错误。它最好保留默认设置,因为它们是安全的,高度优化。

如果 check_circular 为 false (默认: True),容器类型的循环引用检查将被跳过,然后循环引用会导致更糟的OverflowError 。

如果 allow_nan 为 false (默认: True),那么它将是 ValueError 来序列化超过 float范围的值 (nan,inf、-inf) 中的 JSON 规范严格遵守。如果 allow_nan 为 true,则将使用对应的 JavaScript (NaN,无穷大,无穷大)。

如果indent缩进是一个字符串,然后 JSON 数组元素和对象成员将漂亮打印与换行符,其次是对于每个级别的嵌套重复该字符串。无 (默认值) 选择没有任何换行符的最紧凑的表示形式。为后仰与 simplejson 比 2.1.0,整数早版本兼容性也可以接受,转换为字符串,与很多空格。

如果指定,分隔符应该是 (item_separator,dict_separator) 的元组。默认情况下,(',',': ') 使用。若要获取的最紧凑的 JSON 表示形式,您应指定 (',',': ') 以消除空白。
编码是字符编码为 str 实例,默认值为 ' utf-8'。
default(obj) 是 obj 的一个函数,应返回一个可序列化版本或引发 TypeError。默认值只是引发 TypeError。
若要使用一个自定义的 JSONEncoder 子类 (例如一个重写要序列化的其他类型的 default () 方法),请使用 cls kwarg 指定。
如果 use_decimal 为 true (默认值: True) 然后十进制。十进制将本机序列化为 JSON 完全精度
 
如果 namedtuple_as_object 为 true (默认: True),用 _asdict() 方法的对象将被编码为 JSON 对象。
如果 tuple_as_array 为 true (默认值: True),元组 (和子类) 将编码为 JSON 数组。
 
如果 bigint_as_string 为 true (默认值: False),int' 2 ** 53 和高于或低于-2 ** 53 将作为字符串进行编码。这是为了避免舍入,否则在 Javascript 中发生。注意此选项丢失类型信息,所以极端谨慎使用。
如果 sort_keys 为 true (False),则输出的词典将排序的关键 ;这是有用的回归测试,以确保可以将 JSON 序列在日常基础上进行比较。
如果 item_sort_key 是可调用 (False),然后输出的词典将与它进行排序。可调用将使用像这样: sorted(dct.items(),关键 = item_sort_key)。此选项将优先于 sort_keys。
 
分类:  Python

相关文章:

  • 航空业走向发展黄金期,P2P线下金融实现线上大迁徙
  • Linux命令之top、ulimit、free
  • 如何画实体关系图
  • HashSet源码分析
  • TCP是如何保证包的顺序传输
  • .Net Remoting常用部署结构
  • 阿里巴巴王坚:数据的价值在于计算
  • mysql 删除单表内多个字段重复的数据
  • linux中分区挂载的解释
  • ubuntu下好用的音乐播放器audacious
  • pip install read time-out
  • 固定资产分类(仅供参考 2005年),
  • 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
  • activiti与spring集成
  • CSS 之怀疑自己的审美 2 (Day50)
  • hexo+github搭建个人博客
  • bearychat的java client
  • Debian下无root权限使用Python访问Oracle
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Lsb图片隐写
  • TCP拥塞控制
  • 产品三维模型在线预览
  • 官方解决所有 npm 全局安装权限问题
  • 老板让我十分钟上手nx-admin
  • 面试遇到的一些题
  • 漂亮刷新控件-iOS
  • 如何设计一个比特币钱包服务
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序开发中的那些坑
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # .NET Framework中使用命名管道进行进程间通信
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (层次遍历)104. 二叉树的最大深度
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)mysql使用Navicat 导出和导入数据库
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .md即markdown文件的基本常用编写语法
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .Net8 Blazor 尝鲜
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ C++ ] STL---string类的使用指南