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相似。

特点:

c样式注释

支持C风格的注释。 单行

// TEST/* TEST */
pip install exjson --upgrade
0

c样式包含指令

从加载文件的同一路径加载指定的文件。 支持两种始终包含在注释中的语法:

pip install exjson --upgrade
1

属性名称(可选)

这是将封装包含的文件内容的json属性的名称。在其他属性之间包含文件时,这是必需的。

pip install exjson --upgrade
2
pip install exjson --upgrade
3

json文件相对路径

这是json文件名,包括主json文件所在路径的相对路径(如果位于嵌套文件夹中)。当主json作为字符串加载并且未指定包含路径时,它将使用正在执行的python脚本路径。 如果找不到脚本,将引发错误。

include指令参数可以包含在<;

通过引用访问值

$root$parent$this访问器前缀受支持。这些访问器允许您引用来自json根、父或当前对象的值,即使这些值正在被包含或其值是在运行时使用函数计算的,并且它们可以插入到字符串中,而无需包含字符。

示例:

pip install exjson --upgrade
4

结果:

pip install exjson --upgrade
5
  • 第一个[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-86012018-05-25T15:05:25.120Z

无需担心在Windows或Linux上运行它。通用格式转换器负责处理特定于平台的令牌

如何创建自定义脚本扩展函数并在运行时注册它。

虽然可以通过问题(请求)或将请求拉入版本分支来添加标准函数,但您可能希望使用一些对您的场景过于特定的函数,这些函数不能归类为标准函数。在这种情况下,您可能希望在运行时注册它们。

标准或自定义脚本扩展函数示例:

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变量,以便允许传入未定义数量的参数。如果需要,可以在函数体内部执行参数检查。脚本扩展函数应始终返回一个基元类型(intstrfloat等)。阵列和其他类型尚不受支持。

注册:

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文件中的任何位置访问结果值。

生命周期:

  1. 加载json文件内容
  2. 将提取注释。
  3. 指令从注释中提取。
  4. include文件(include指令)内容将递归提取(应用步骤1到4)。 如果确定包含的文件具有循环引用,则加载过程将停止。
  5. include文件被合并到包含它的json文件中。
  6. 提取并计算脚本函数调用。
  7. 对相对值和绝对值引用进行求值。

单元测试要求:

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

  1. 安装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
  1. 安装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
  1. 安装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安装它。

窗口

  1. 从graphiviz站点下载graphviz for windows
  2. 在windows路径中添加graphviz bin路径c:\程序文件(x86)\ graphviz2.38\bin
  3. 关闭并重新打开终端,以便识别路径更改。
  4. 下载pygraphviz python 3.6轮子
  5. 安装pygraphviz车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}
0
  1. 安装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

  1. 安装自制程序
  2. 下载pygraphviz python 3.6轮子
  3. 安装pygraphviz车轮。
{"name":"test file","values":[{"value_id":"93987272","value":"This Value"},{"value_id":"923ko30k3","value":"Another Value"}]}
0
  1. 安装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

路线图:

  • 更好的单元测试覆盖率。
  • 稳定并解决任何错误。
  • 分离并制作更好的脚本扩展文档。
  • 支持多文件序列化。
  • 有关更多详细信息,请查看标记为下一版本的问题。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证