在游戏开发中,经常使用json作为配置文件,lua作为脚本,虽然在lua中读取json不算太麻烦,但是如果预先将json转换为lua中的表,不但在脚本中操作方便,也省去了在游戏中加载json的时间,因此写了一个python 脚本将json配置文件直接转化为lua中的table,代码如下:
转载请保留原文地址:http://blog.csdn.net/liangneo/article/details/42461509
代码地址: https://github.com/neoliang/jsontolua
import json
import types
def space_str(layer):
lua_str = ""
for i in range(0,layer):
lua_str += '\t'
return lua_str
def dic_to_lua_str(data,layer=0):
d_type = type(data)
if d_type is types.StringTypes or d_type is str or d_type is types.UnicodeType:
return "'" + data + "'"
elif d_type is types.BooleanType:
if data:
return 'true'
else:
return 'false'
elif d_type is types.IntType or d_type is types.LongType or d_type is types.FloatType:
return str(data)
elif d_type is types.ListType:
lua_str = "{\n"
lua_str += space_str(layer+1)
for i in range(0,len(data)):
lua_str += dic_to_lua_str(data[i],layer+1)
if i < len(data)-1:
lua_str += ','
lua_str += '\n'
lua_str += space_str(layer)
lua_str += '}'
return lua_str
elif d_type is types.DictType:
lua_str = ''
lua_str += "\n"
lua_str += space_str(layer)
lua_str += "{\n"
data_len = len(data)
data_count = 0
for k,v in data.items():
data_count += 1
lua_str += space_str(layer+1)
if type(k) is types.IntType:
lua_str += '[' + str(k) + ']'
else:
lua_str += k
lua_str += ' = '
try:
lua_str += dic_to_lua_str(v,layer +1)
if data_count < data_len:
lua_str += ',\n'
except Exception, e:
print 'error in ',k,v
raise
lua_str += '\n'
lua_str += space_str(layer)
lua_str += '}'
return lua_str
else:
print d_type , 'is error'
return None
json_dic = '{}'
print(dic_to_lua_str(json.loads(json_dic)))
json_dic = '{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter","作者":"liangneo","说明":"转载请保留原文地址:","blog":"http://blog.csdn.net/liangneo/"}'
print(dic_to_lua_str(json.loads(json_dic)))
json_dic = '''
{
"maxStep":20,
"goals":
[
{
"type":"piece",
"id":1,
"num":20
},
{
"type":"piece",
"id":2,
"num":5
},
{
"type":"monster",
"num":5
}
],
"atk":[1,22,33,44],
"ai":
{
"level1":
{
"attack_round":[44,47,55]
},
"level2":
{
"def":
{
"normal":[1,2,3,4],
"wounded":[10,12,23,25]
}
}
}
}
'''
print(dic_to_lua_str(json.loads(json_dic)))
例1:
json:
{}
转化后的lua:
{}
例2:
json:
{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter","author":"liangneo","blog":"http://blog.csdn.net/liangneo/"}
{
__module__ = 'Person',
name = 'Peter',
author = 'liangneo',
age = 22,
__class__ = 'Person',
blog = 'http://blog.csdn.net/liangneo/'
}
json:
{
"maxStep":20,
"goals":
[
{
"type":"piece",
"id":1,
"num":20
},
{
"type":"piece",
"id":2,
"num":5
},
{
"type":"monster",
"num":5
}
],
"atk":[1,22,33,44],
"ai":
{
"level1":
{
"attack_round":[44,47,55]
},
"level2":
{
"def":
{
"normal":[1,2,3,4],
"wounded":[10,12,23,25]
}
}
}
}
lua:
{
ai =
{
level1 =
{
attack_round = {
44,47,55
}
},
level2 =
{
def =
{
wounded = {
10,12,23,25
},
normal = {
1,2,3,4
}
}
}
},
maxStep = 20,
goals = {
{
num = 20,
type = 'piece',
id = 1
},
{
num = 5,
type = 'piece',
id = 2
},
{
num = 5,
type = 'monster'
}
},
atk = {
1,22,33,44
}
}