HJSON:可注释、更简洁易用的JSON用户接口及其在Python中的使用
JSON是现代常用的一种数据储存和表示格式,具有良好的阅读和编写体验。在Python语言中可以和字典、列表等数据格式完美兼容。
在现在的RESTful网络通信中,json被用来作为数据载体返回服务器的相应数据,相比于xml格式它具有更好的信噪比,一定程度上降低了网络的压力。
此外,JSON的另一个作用是作为配置文件使用,不过当使用json作为配置文件时,其有一个问题,就是json中不允许使用注释等额外的不符合json语法格式的内容(当然我们可以选择其他的如ini, yaml等格式来使用)。
HJSON是一种可以添加注释,而且更加简洁的JSON表示,支持在.NET、JAVA、Python、GO等语言中使用。Hjson, a user interface for JSON
1. 相比于JSON,Hjson有以下几个特点:
-
不会因为缺少逗号而出现语法错误,只要把每个键值对写在新的一行中即可。
{ first: 1 second: 2 }
-
可以添加注释:
Hjson支持使用单行注释:
#
和//
, 和多行注释/**/
。Python中的三引号的多行注释格式在Hjson中用来表示多行字符串。
{ # hash style comments # (because it's just one character) // line style comments // (because it's like C/JavaScript/...) /* block style comments because it allows you to comment out a block */ # Everything you do in comments, # stays in comments ;-} }
-
对象的key可以不使用双引号来指定,编写时更加方便。
{ # specify rate in requests/second rate: 1000 }
-
对象的value如果是单行的字符串,也可以不添加引号
{ JSON: "a string" Hjson: a string # notice, no escape necessary: RegEx: \s+ }
-
可以书写多行字符串,方便阅读,使用三引号来表示:
{ md: ''' First line. Second line. This line is indented by two spaces. ''' }
-
标点符号,空格和退格符:
JSON 和 Hjson 使用字符
{}[],:
作为标点符号来定义数据的结构。标点符号和空格不能用在无引号的键中,也不能用作无引号字符串的第一个字符。在这种情况下,我们就需要使用引号来表示含有标点符号的字符串。
反斜杠只用作引号字符串中的转义字符。
{ "key name": "{ sample }" "{}": " spaces at the start/end " this: is OK though: {}[],: }
2. 在Python中使用Hjson:
Hjson为Python 2.5+ 和Python3.3+ 版本提供了支持,使用pip install hjson
即可安装使用。
安装后不仅可以作为Python第三方库使用,它还提供了在命令行中使用的hjson
命令:
Usage:
hjson [options]
hjson [options] <input>
hjson (-h | --help)
hjson (-V | --version)
Options:
-h --help Show this screen.
-j Output as formatted JSON.
-c Output as JSON.
-V --version Show version.
使用时可以将字符串格式化为hjson或对内容进行格式校验: echo '{"json":"obj"}' | hjson
在Python中使用时和json库的操作类似,非常的简单:
首先导入hjson库:import hjson
-
读取字符串hjson:
text = """{ foo: a bar: 1 }""" h = hjson.loads(text) print(h) # OrderedDict([('foo', 'a'), ('bar', 1)])
如果想读取hjson文件内容可以使用
hjson.load()
方法。 -
保存数据为hjson:
hjson.dumps({'foo': 'text', 'bar': (1, 2)})
执行后可将Python对象内容保存为:
{ foo: text bar: [ 1 2 ] }
如果想将Python对象以Hjson格式保存在文件中可以使用
hjson.dump()
方法。 -
将hjson数据内容编码为JSON:
hjson也可以去除掉hjson的特性将数据保存在为JSON格式:
hjson.dumpsJSON(['foo', {'bar': ('baz', None, 1.0, 2)}]) # '["foo", {"bar": ["baz", null, 1.0, 2]}]'
将其保存在JSON文件中则可以使用
hjson.dumpJSON()
方法。
更多hjson库的API可以参考:https://hjson.github.io/hjson-py/ 。