背景
某需求要将json转换成lua代码,同事们的做法是人肉翻译,肉眼读json,然后一条条拷贝到lua,如果遇到嵌套多的情况,一不小心就搞错了。
即使没有出错,顺利翻译完成,一条简单的json将耗时半小时。如果是100条,将浪费50个小时,太恐怖了。
我在翻译了一次之后,实在是无法接受,于是想通过python来解析json,然后按照格式生成lua代码,也就是用代码写代码
。
这样可以避免机械劳动,不再浪费生命,可以从原来的半小时减少到1分钟,并且不容易出错。
效果
原始的json文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
转换成lua的样子1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21local msg = {}
local glossary = {}
local GlossDiv = {}
local GlossList = {}
local GlossEntry = {}
local GlossDef = {}
GlossDef.GlossSeeAlso = {"GML","XML"}
GlossDef.para = "A meta-markup language, used to create markup languages such as DocBook."
GlossEntry.GlossDef = GlossDef
GlossEntry.GlossSee = "markup"
GlossEntry.Acronym = "SGML"
GlossEntry.GlossTerm = "Standard Generalized Markup Language"
GlossEntry.Abbrev = "ISO 8879:1986"
GlossEntry.SortAs = "SGML"
GlossEntry.ID = "SGML"
GlossList.GlossEntry = GlossEntry
GlossDiv.GlossList = GlossList
GlossDiv.title = "S"
glossary.GlossDiv = GlossDiv
glossary.title = "example glossary"
msg.glossary = glossary
思路
- simplejson解析原始的json文件
- 识别出array,subitem,alue
- subitem递归下去,然后一层一层往上汇总
- 根据规律分别组装出lua代码
- 输出
步骤
simplejson
先要安装simplejson
1 | sudo pip install simplejson |
分析value
1 | def printValue(key, value, prefix, substring): |
根据不同的值,转换成lua的结果。例如None
对应的是gLuaNULL.null
,True
对应true
,普通的值就等于’”json中的值”‘
例如1
2
3"GlossEntry": {
"ID": "SGML"
}
转换成1
GlossEntry.ID = "SGML"
分析array
1 | "GlossSeeAlso": ["GML", "XML"] |
类似于这样的,就要转换成1
GlossDef.GlossSeeAlso = {"GML","XML"}
python代码如下1
2
3
4
5
6
7def printArray(key, value, prefix):
elements = '{'
for i in value:
elements += '"{}",'.format(i)
elements = elements[:-1]
elements += '}'
print '{}{}{}{}'.format(prefix, key, ' = ', elements)
分析subitem
需要用到递归,将item不停的传递下去,直到完成
不多解释了,直接看代码吧1
2
3
4
5
6
7def printSubItem(key, value, prefix):
#print '{}11111111111'.format(key)
local = 'local ' + key + ' = {}'
print local
parseJson(value, key+'.')
print '{}{} = {}'.format(prefix, key, key)
#print '{}22222222222'.format(key)
代码链接
放在https://github.com/CodeJuan/python_convert_json2lua
本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/