python的扩展json解析器库
exjson的Python项目详细描述
exjson
python的扩展json解析器
简介
exjson是在python标准json解码器库之上的一层,它实现了当前它不支持的功能,同时尽可能地保持与json标准兼容。
主要功能
- C风格单行和多行注释。
- 包含本地存储或http/https源中的其他json文件。
- 包括文件校验和验证。
- 使用
$root
,$parent
和$this
引用绝对值和相对值
- 可扩展脚本。
支持的Python版本
- python 3.x
安装/升级
pip install exjson --upgrade
样品
samplefile1.json
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
samplefile2.json
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
用法
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
结果.json
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}
include指令接受三个参数,其中只需要第一个参数。它们是管道分隔的。
#INCLUDE "test.json|{}|e3ae49df2030ee913f8be352999f30d7"
test.json
:要包含的文件的位置。{}
:如果找不到文件且未找到包含的文件上的错误,则使用的默认值设置为false
e3ae49df2030ee913f8be352999f30d7
:需要校验和。它将用于验证文件的有效性。
此外,您还可以从http/https url下载文件并验证其校验和,以防止恶意代码的注入。
从http/https包含
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"http://www.exjson.com/lab/test.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
从http/https包含并验证校验和
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"http://www.exjson.com/lab/test.json|{}|e3ae49df2030ee913f8be352999f30d7"*/{"value_id":"923ko30k3","value":"Another Value"}]}
有关更复杂的示例,请查看单元测试
API
exjson api提供的api与python标准json解码器/编码器库中提供的api相似。
加载(json_file_path,encoding=none,cls=none,object_hook=none,parse_float=none, parse_int=none,parse_constant=none,object_pairs_hook=none,error_on_include_found=false,**kw)
将json文件反序列化到字典中。
参数:
json文件路径
:要加载的主json文件。编码
:加载文件和所有包含的文件时使用的编码编解码器。所有包含的文件都应使用相同的编码。cls
:如果指定,它将使用提供的自定义jsondecoder实例来解码json文件。有关详细信息,请参阅python文档。object_hook
:如果指定,将为每个解码的json对象调用它,并使用它的值,而不是默认的dict
。有关详细信息,请参阅python文档。parse_float
:如果指定,将为解码的每个float
调用它。有关详细信息,请参阅python文档。parse_int
:如果指定,则将为解码的每个int
调用它。有关详细信息,请参阅python文档。parse_constant
:如果指定,将使用以下字符串之一调用:'-infinity','infinity','nan'。有关详细信息,请参阅python文档。object_pairs_hook
:如果指定,将为每个解码的json对象调用它,并为其排序成对列表。它的结果将被使用,而不是默认的dict
。有关详细信息,请参阅python文档。未找到包含的文件时出错:如果设置为
true
则未找到包含的文件时会引发异常。
支持的扩展功能:
- 支持include指令。
- 支持单行和多行C样式注释
加载(json_string,encoding=none,cls=none,object_hook=none,parse_float=none, parse_int=none,parse_constant=none,object_pairs_hook=none,error_on_include_found=false,include_path=none,**kw)
将json字符串反序列化到字典中。
参数:
json文件路径
:要加载的主json文件。编码
:加载文件和所有包含的文件时使用的编码编解码器。所有包含的文件都应使用相同的编码。cls
:如果指定,它将使用提供的自定义jsondecoder实例来解码json文件。有关详细信息,请参阅python文档。object_hook
:如果指定,将为每个解码的json对象调用它,并使用它的值,而不是默认的dict
。有关详细信息,请参阅python文档。parse_float
:如果指定,将为解码的每个float
调用它。有关详细信息,请参阅python文档。parse_int
:如果指定,则将为解码的每个int
调用它。有关详细信息,请参阅python文档。parse_constant
:如果指定,将使用以下字符串之一调用:'-infinity','infinity','nan'。有关详细信息,请参阅python文档。object_pairs_hook
:如果指定,将为每个解码的json对象调用它,并为其排序成对列表。它的结果将被使用,而不是默认的dict
。有关详细信息,请参阅python文档。未找到包含的文件时出错:如果设置为
true
则未找到包含的文件时会引发异常。includes_path
:如果提供,它将用于设置加载包含文件的根路径。如果未提供,则将使用正在执行的python脚本路径。请记住,要考虑与此指令相关的include
指令文件路径。
支持的扩展功能:
- 支持include指令。
- 支持单行和多行C样式注释
转储(obj,skipkeys=false,确保ascii=true,检查circular=true, allow_nan=true,cls=none,indent=none,separators=none, 默认值=无,排序键=假,**kw)
将python对象/字典实例序列化为json字符串。
参数:
obj
:要编码(序列化)的对象实例。skipkeys
:如果设置为false
atypeerror
如果键不是基元类型(int
,str
,float
或none
),则会引发。有关详细信息,请参阅python文档。确保ascii
:如果设置为true
所有传入的ascii字符都将在输出中转义,否则它们将保持原样。有关详细信息,请参阅python文档。check_circular
:如果设置为true
将检查所有类和字典以防止循环引用,从而防止无限递归。有关详细信息,请参阅python文档。允许NaN
:如果设置为true
,NaN
,infinity
和-infinity
将按此编码。有关详细信息,请参阅python文档。cls
:有关详细信息,请参阅python文档。缩进
:如果设置为true
则输出json将缩进。有关详细信息,请参阅python文档。分隔符
:如果指定,它应该是一个元组,列出编码期间要使用的项和键分隔符。有关详细信息,请参阅python文档。默认值
:有关详细信息,请参阅python文档。排序键
:设置为真
输出字典将按键排序。有关详细信息,请参阅python文档。
支持的扩展功能:
- 不支持include指令。
- 不支持评论。
特点:
c样式注释
支持C风格的注释。 单行
// TEST/* TEST */
pip install exjson --upgrade0
c样式包含指令
从加载文件的同一路径加载指定的文件。 支持两种始终包含在注释中的语法:
pip install exjson --upgrade1
属性名称(可选)
这是将封装包含的文件内容的json属性的名称。在其他属性之间包含文件时,这是必需的。
pip install exjson --upgrade2
pip install exjson --upgrade3
json文件相对路径
这是json文件名,包括主json文件所在路径的相对路径(如果位于嵌套文件夹中)。当主json作为字符串加载并且未指定包含路径
时,它将使用正在执行的python脚本路径。
如果找不到脚本,将引发错误。
include
指令参数可以包含在<;
或中
通过引用访问值
$root
,$parent
和$this
访问器前缀受支持。这些访问器允许您引用来自json根、父或当前对象的值,即使这些值正在被包含或其值是在运行时使用函数计算的,并且它们可以插入到字符串中,而无需包含字符。
示例:
pip install exjson --upgrade4
结果:
pip install exjson --upgrade5
- 第一个[3]=
$root.prefix4
在插入字符串时引用json根上的前缀的值。
- second=
$root.prefix
引用json根上的前缀的值。
- third.test3.deep3=
$root.secondb
在插入字符串时引用了json根上的second
值。 - third.test3.deep4=
az-$parent.test1x
在插入字符串时引用$root.third.test1
的值,该值是test3
的父对象。 - 第四个。t2=
$这个。T1
引用父级的值
当前限制
< Buff行情>相对和绝对值引用还不支持作为函数参数。
脚本
exjson通过使用基于python的可扩展脚本引擎来支持动态值。常用的扩展函数可以在脚本/扩展包中找到,但您可以使用
register_custom_scripting_扩展创建和加载自己的自定义扩展函数
- 函数调用可以插入
aax-$.sequence('product-sequence')zz
这样的字符串,它将产生aax-1zz
- 空值可以通过使用
null
标准功能:
密码学
MD5
从指定的字符串值生成MD5哈希。如果没有提供字符串,则使用128个随机位的随机长。
签名
pip install exjson --upgrade
6
用法
json{"value":"$.md5('test message')","value1":"$.md5()"}
结果
json{"value":"c72b9698fa1927e1dd12d3cf26ed84b2","value1":"a1fa3183987e9a93338afb0831709d7"}
sha1
从指定的字符串值生成SHA1哈希。如果没有提供字符串,则使用128个随机位的随机长。
签名
pip install exjson --upgrade
7
用法< /P>
pip install exjson --upgrade
8
结果
pip install exjson --upgrade
9
SHA256
从指定的字符串值生成SHA256哈希。如果没有提供字符串,则使用256个随机位的随机长度。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
0
用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
1
结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
2
SHA512
从指定的字符串值生成SHA512哈希。如果没有提供字符串,则使用512个随机位的随机长度。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
3
用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
4
结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
5
日期和时间
默认情况下,date time函数将返回日期和时间,格式为iso-8601,甚至在UTC上使用显式TZ。使用下表中所述的z
格式可以实现ISO-8601 ZULU格式:
<表><广告>"通用"格式代码
python格式代码 说明
示例
< /广告><正文>dddd %a工作日作为区域设置的全名。 星期一 <
%a工作日作为地区的缩写名称。 MON/TTD> WW %W 工作日为零填充数字,其中0表示星期日,6表示星期六。 >w/td> %-W 工作日为十进制数,其中0表示星期日,6表示星期六。 dd %d 以零填充的十进制数字表示的月份的第几天。 d %-d 以十进制数字表示的一个月中的第几天。 嗯 %B 月份作为区域设置的全名。 九月 MMM %B 月份作为地区的缩写名称。 SEP mm %M 月份为零填充的十进制数。 < m >< > > %-M 月份为十进制数。 年 %y 以世纪为十进制数的年份。 2013年 y %y 不带世纪的年份,用零填充小数。 HH %h 小时(24小时制)作为一个零填充的十进制数字。 h <
小时(24小时制)为十进制数。 HH %i 小时(12小时制)作为零填充十进制数。 h %-i 小时(12小时制)为十进制数。 TT/TTD> %P 地区等同于上午或下午。 > mm %M 分钟作为零填充的十进制数。 M %-M 分钟作为十进制数。 SS %s 第二个是零填充的十进制数。 s<td> %s 秒作为十进制数。 f %f 微秒为十进制数,左边加零。 000000 ZZZ %Z 时区名称(如果对象是-00:00,则为空字符串)。 -04:00 Z %Z 格式为+hhmm或-hhmm的UTC偏移量。 -04:00 >j/td> %j 一年中以零填充的十进制数字表示的日期。 JJ %-J 以十进制数字表示的一年中的第几天。 UU %u<td> 一年中的周数(星期日为一周的第一天),用零填充的十进制数。新年中第一个星期日之前的所有日子都被视为第0周。 u %-u 一年中的第几周(星期日为一周的第一天)作为十进制数。新年中第一个星期日之前的所有日子都被视为第0周。 WW %W 一年中的周数(星期一为一周的第一天),用零填充的十进制数表示。新年第一个星期一之前的所有日子都被视为第0周。 >w/td> %W 一年中的第几周(星期一为一周的第一天)作为十进制数。新年第一个星期一之前的所有日子都被视为第0周。 q 自定义 日历季度为零填充数字。 qq 自定义 日历季度编号。 f %c 区域设置的适当日期和时间表示。 2013年9月30日星期一07:06:05
d %x 区域设置的适当日期表示。 2013年9月30日 >t/td> %x 区域设置的适当时间表示。 07:06:05 Z %年-%m-%dt%h:%m:%s.%f%z 祖鲁联合技术公司ISO-8601 2018-05-25T15:05:25.120Z 无需担心在Windows或Linux上运行它。通用格式转换器负责处理特定于平台的令牌
现在()
根据服务器时区获取当前日期和时间。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
6
用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
7
结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
8
现在().add()
根据服务器时区将指定数量的时间单位添加到当前日期和时间。
<表><广告>时间单位
说明
< /广告><正文>天< /td> 加或减天数。 周 加或减周。 月 加或减月份。 年份 加上或减去年份。 季度 加减四分之一。 签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
9
用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
0
结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
1
现在().utc()
与now()
相同,但返回utc
日期和时间。
现在().utc().add()
与now().add()
相同,但返回utc
日期和时间。
序列和标识
uuid4()
返回uuid v4哈希值。
签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
2
用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
3
结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
4
序列()
创建并返回一个或多个命名整数序列值。每个加载/加载调用都会生成序列。序列一旦填充到json文件中就会被销毁。
签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
5
padding_模式使用python字符串格式化迷你语言如果没有提供值,步骤
默认为1
。
用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
6
结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
7
文件校验和()
计算指定文件的MD5或SHA1校验和。如果加载或包含json文件,则该文件路径应相对于该文件所在的路径。如果使用json字符串中的加载,则与正在执行的python脚本相关。如果没有,则默认情况下将使用md5
算法。
签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
8
支持的算法有md5
和sha1
用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
9
结果
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
0
如何创建自定义脚本扩展函数并在运行时注册它。
虽然可以通过问题(请求)或将请求拉入版本分支来添加标准函数,但您可能希望使用一些对您的场景过于特定的函数,这些函数不能归类为标准函数。在这种情况下,您可能希望在运行时注册它们。
标准或自定义脚本扩展函数示例:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
1
自定义脚本函数应该始终有一个*args
变量,以便允许传入未定义数量的参数。如果需要,可以在函数体内部执行参数检查。脚本扩展函数应始终返回一个基元类型(int
,str
,float
等)。阵列和其他类型尚不受支持。
注册:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
2
用法:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
3
结果:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
4
使用相对和绝对访问器$this
,$parent
和$root
可以从当前文件或包含的json文件中的任何位置访问结果值。
生命周期:
- 加载json文件内容
- 将提取注释。
- 指令从注释中提取。
- include文件(
include
指令)内容将递归提取(应用步骤1到4)。
如果确定包含的文件具有循环引用,则加载过程将停止。 - include文件被合并到包含它的json文件中。
- 提取并计算脚本函数调用。
- 对相对值和绝对值引用进行求值。
单元测试要求:
exjson单元测试在标准python单元测试库上运行。但是exjson单元测试函数支持从每个测试函数执行中自动生成调用图。正因为如此,pycallgraph还依赖于pycallgraph。请按照以下步骤在Windows、Linux或OSX上安装此依赖项。
请记住,下面的步骤假设您已经安装了python 3.6+和pip。根据环境的设置方式,python 3.xpip
可以通过名为pip3
的别名获得。
打开和关闭调用图生成器
调用图生成由名为generate\u call\u graphs
的环境变量控制。如果环境变量不存在,则默认值为false生成。如果它存在并且设置为true
图形将在测试/调用
文件夹中生成。
Linux/OSX
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
5
窗口
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
6
ubuntu
- 安装graphviz和它的开发库
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
7
- 安装pygraphviz
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
8
- 安装
pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
9
或者,您也可以从pypi.org下载pygraphviz控制盘文件,并按照下面针对Windows的步骤4和步骤5安装它。
窗口
- 从graphiviz站点下载graphviz for windows
- 在windows路径中添加graphviz bin路径
c:\程序文件(x86)\ graphviz2.38\bin
。 - 关闭并重新打开终端,以便识别路径更改。
- 下载pygraphviz python 3.6轮子
- 安装
pygraphviz
车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}
0
- 安装pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
9
OSX
- 安装自制程序
- 下载pygraphviz python 3.6轮子
- 安装
pygraphviz
车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}
0
- 安装
pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
9
路线图:
- 更好的单元测试覆盖率。
- 稳定并解决任何错误。
- 分离并制作更好的脚本扩展文档。
- 支持多文件序列化。
- 有关更多详细信息,请查看标记为下一版本的问题。
推荐PyPI第三方库
MD5
从指定的字符串值生成MD5哈希。如果没有提供字符串,则使用128个随机位的随机长。
json{"value":"$.md5('test message')","value1":"$.md5()"}
结果
json{"value":"c72b9698fa1927e1dd12d3cf26ed84b2","value1":"a1fa3183987e9a93338afb0831709d7"}
sha1
从指定的字符串值生成SHA1哈希。如果没有提供字符串,则使用128个随机位的随机长。
签名
pip install exjson --upgrade7
用法< /P>
pip install exjson --upgrade8
结果
pip install exjson --upgrade9
SHA256
从指定的字符串值生成SHA256哈希。如果没有提供字符串,则使用256个随机位的随机长度。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}0
用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}1
结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}2
SHA512
从指定的字符串值生成SHA512哈希。如果没有提供字符串,则使用512个随机位的随机长度。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}3
用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}4
结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}5
z
格式可以实现ISO-8601 ZULU格式:现在()
根据服务器时区获取当前日期和时间。
签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
6用法< /P>
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
7结果
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
8现在().add()
根据服务器时区将指定数量的时间单位添加到当前日期和时间。
<表><广告> < /广告><正文>时间单位 说明 天< /td> 加或减天数。 周 加或减周。 月 加或减月份。 年份 加上或减去年份。 季度 加减四分之一。 签名
{//SampleProperty"name":"test file",//Samplevaluesetwithanincludedobject"values":[/*INCLUDE"samplefile2.json"*/{"value_id":"923ko30k3","value":"Another Value"}]}
9用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
0结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
1现在().utc()
与
now()
相同,但返回utc
日期和时间。现在().utc().add()
与
now().add()
相同,但返回utc
日期和时间。序列和标识
uuid4()
返回uuid v4哈希值。
签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
2用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
3结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
4序列()
创建并返回一个或多个命名整数序列值。每个加载/加载调用都会生成序列。序列一旦填充到json文件中就会被销毁。
签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
5padding_模式使用python字符串格式化迷你语言如果没有提供值,
步骤
默认为1
。用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
6结果
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
7文件校验和()
计算指定文件的MD5或SHA1校验和。如果加载或包含json文件,则该文件路径应相对于该文件所在的路径。如果使用json字符串中的加载,则与正在执行的python脚本相关。如果没有,则默认情况下将使用
md5
算法。签名
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
8支持的算法有
md5
和sha1
用法< /P>
/*INCLUDIBLETESTFILE*/{"value_id":"93987272","value":"This Value"}
9结果
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))
0
如何创建自定义脚本扩展函数并在运行时注册它。
虽然可以通过问题(请求)或将请求拉入版本分支来添加标准函数,但您可能希望使用一些对您的场景过于特定的函数,这些函数不能归类为标准函数。在这种情况下,您可能希望在运行时注册它们。
标准或自定义脚本扩展函数示例:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))1
自定义脚本函数应该始终有一个*args
变量,以便允许传入未定义数量的参数。如果需要,可以在函数体内部执行参数检查。脚本扩展函数应始终返回一个基元类型(int
,str
,float
等)。阵列和其他类型尚不受支持。
注册:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))2
用法:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))3
结果:
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))4
使用相对和绝对访问器$this
,$parent
和$root
可以从当前文件或包含的json文件中的任何位置访问结果值。
生命周期:
- 加载json文件内容
- 将提取注释。
- 指令从注释中提取。
- include文件(
include
指令)内容将递归提取(应用步骤1到4)。 如果确定包含的文件具有循环引用,则加载过程将停止。 - include文件被合并到包含它的json文件中。
- 提取并计算脚本函数调用。
- 对相对值和绝对值引用进行求值。
单元测试要求:
exjson单元测试在标准python单元测试库上运行。但是exjson单元测试函数支持从每个测试函数执行中自动生成调用图。正因为如此,pycallgraph还依赖于pycallgraph。请按照以下步骤在Windows、Linux或OSX上安装此依赖项。
请记住,下面的步骤假设您已经安装了python 3.6+和pip。根据环境的设置方式,python 3.xpip
可以通过名为pip3
的别名获得。
打开和关闭调用图生成器
调用图生成由名为generate\u call\u graphs
的环境变量控制。如果环境变量不存在,则默认值为false生成。如果它存在并且设置为
true
图形将在测试/调用
文件夹中生成。
Linux/OSX
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))5
窗口
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))6
ubuntu
- 安装graphviz和它的开发库
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))7
- 安装pygraphviz
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))8
- 安装
pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))9
或者,您也可以从pypi.org下载pygraphviz控制盘文件,并按照下面针对Windows的步骤4和步骤5安装它。
窗口
- 从graphiviz站点下载graphviz for windows
- 在windows路径中添加graphviz bin路径
c:\程序文件(x86)\ graphviz2.38\bin
。 - 关闭并重新打开终端,以便识别路径更改。
- 下载pygraphviz python 3.6轮子
- 安装
pygraphviz
车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}0
- 安装pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))9
OSX
- 安装自制程序
- 下载pygraphviz python 3.6轮子
- 安装
pygraphviz
车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}0
- 安装
pycallgraph
importexjsonasjson# Decodesample_value_set=json.load("./samplefile1.json")# ... Do stuff with sample_value_set# Encodewithopen("./result.json")asf:f.write(json.dumps(sample_value_set))9
路线图:
- 更好的单元测试覆盖率。
- 稳定并解决任何错误。
- 分离并制作更好的脚本扩展文档。
- 支持多文件序列化。
- 有关更多详细信息,请查看标记为下一版本的问题。