现在的位置: 首页 > 综合 > 正文

将json转化为lua中的表

2018年05月27日 ⁄ 综合 ⁄ 共 2617字 ⁄ 字号 评论关闭

在游戏开发中,经常使用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/"}

lua:

{
	__module__ = 'Person',
	name = 'Peter',
	author = 'liangneo',
	age = 22,
	__class__ = 'Person',
	blog = 'http://blog.csdn.net/liangneo/'
}

例3:

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
	}
}

抱歉!评论已关闭.