简要:文章主要指引JSON的读取与解析,在解析的过程中根据JSON的结构不同会有一些差异,具体可根据详情而进行处理,这里只算最基础的抛砖引玉了。
EXCEL的处理
- 如图下所示,标题主要为自己编辑数据备注而用,咱们主要是要处理标题之下黑框范围内的数据。

- 把黑框范围内的所有数据选中后复制,在JSON在线编辑器内选择【EXCEL转JSON → 按行转成数组】转成JSON格式。推荐:站长之家-JONS编辑器
- 转出后的数据如下,此时数据格式为纯数组的格式,在GML中可以理解成嵌套的LIST → LIST,但是由于GML默认是把JSON从转化成MAP,以此格式下需要读取以"default"(GML默认)为键名的键值来获取内容,由于不便于理解,下面我们将把一下转换成MAP → LIST。
[
["0","1","2","3","4","100","100","100","100","100"],
["1","2","3","4","5","100","100","100","100","100"],
["2","3","4","5","6","100","100","100","100","100"],
["3","4","5","6","7","100","100","100","100","100"],
["4","5","6","7","8","100","100","100","100","100"],
["5","6","7","8","9","100","100","100","100","100"],
["6","7","8","9","10","100","100","100","100","100"],
["7","8","9","10","11","100","100","100","100","100"],
["8","9","10","11","12","100","100","100","100","100"],
["9","10","11","12","13","100","100","100","100","100"],
["10","11","12","13","14","100","100","100","100","100"],
]
- 把转换成的数据复制好,还是刚才的网站选择【JSON在线编辑器】将刚才复制的内容粘贴进去后解析至右边,将格式转化成OBJ后修改至原代码中,操作过程如图所示。

- 至此,JSON已经从EXCEL数据转化完成,最后一步即是把转化出来的内容丢入TXT中,把后缀“TXT”改成“JSON”即可。(注意:若JSON包含中文则必须是UTF-8编码格式,否则将读取错误)
解析JSON
//核心代码:
file_text_open_read //打开文件:打开后才能读取字符串
file_text_close //关闭文件:打开后不关闭多了就会引起内存泄露
file_text_read_string //读取打开文件的字符串:只能读取一行,换行后就无法读取了
json_decode //转化JSON为MAP文件
1.优先确定需要打开的文件,咱们这里先让使用者选择文件夹,这样的好处是可以直接获取玩家的读取权限,当然这样对于游戏来说并不是特别好,所以后面再介绍内含文件的方法,如下代码:
file_read = get_open_filename("json file|*.json", ""); //选择获取文件
2.玩家已经选择完毕文件后,下面需要读取所选择的文件,如下代码:
read = file_text_open_read(file_read); //读取文件,若读取的是内涵文件则直接吧file_read改成"内涵文件名"即可。(注意要引号)
3.接下来则需要把读取的文件里面的内容取出来放到一个变量中去,然后才能被我们所利用,如下代码:
//读取的文字转换成字符串
while(!file_text_eof(read)) //判断读取光标是否已经到了最后,如果没到最后则继续循环
{
text += file_text_read_string(read); //取出当前行的字符串
file_text_readln(read); //光标移动至下一行
}
4.在读取完成之后,最后一步则是把读取出来的字符串变成我们能用的数据结构了:
//解析JSON字符串为MAP
json_set = json_decode(text);
file_text_close(read); //关闭文件
//解析JSON字符串为MAP
json_set = json_decode(text);
file_text_close(read); //关闭文件
解析配置
1.虽然之前的MAP→LIST结构已经可以直接用了,但是作为个人喜欢把它转化成栅格(GRID)格式来用,这样看起来相对直观和便利一些,由于MAP的键名对于我们完全是无用数据,所以我们只需要把键值LIST里面的值依次按排存入GIRD即可,如下代码:
tmp_list = ds_map_find_value(json_set, "0"); //获取GRID宽度,因为每个LIST相同
if ds_exists(global.grid_set, ds_type_grid) ds_grid_destroy(global.grid_set); //先注销已有的GRID,否则多次调用create会造成内存溢出
global.grid_set = ds_grid_create(ds_list_size(tmp_list), ds_map_size(json_set)); //根据MAP的SIZE为高以及LIST的SIZE为宽创建新的GRID
//解析JSON到GRID里面
for(var i = 0; i < ds_map_size(json_set); i++) //依次取出LIST
{
tmp_list = ds_map_find_value(json_set, string(i));
for(var j = 0; j < ds_list_size(tmp_list); j++) //依次把LIST的值放入GRID
{
ds_grid_set(global.grid_set, j, i, real(ds_list_find_value(tmp_list, j)))
}
}
2.至此,可以在任意地方调用global.grid_set全局变量来获得数据了,最后别忘了注销掉用过的数据结构,否则内存会越来越大哦:
//释放临时变量
ds_map_destroy(json_set);
ds_list_destroy(tmp_list);
最终完整代码
/// @description
if global.running == 1 exit;
#region 读取配置文件
file_read = get_open_filename("json file|*.json", "");
read = file_text_open_read(file_read);
text = ""; //定义
//读取的文字转换成字符串
while(!file_text_eof(read)) //判断读取光标是否已经到了最后,如果没到最后则继续循环
{
text += file_text_read_string(read); //取出当前行的字符串
file_text_readln(read); //光标移动至下一行
}
//解析JSON字符串为MAP
json_set = json_decode(text);
file_text_close(read); //关闭文件
#endregion
#region 解析配置文件JSON
tmp_list = ds_map_find_value(json_set, "0"); //获取GRID宽度,因为每个LIST相同
if ds_exists(global.grid_set, ds_type_grid) ds_grid_destroy(global.grid_set); //先注销已有的GRID,否则多次调用create会造成内存溢出
global.grid_set = ds_grid_create(ds_list_size(tmp_list), ds_map_size(json_set)); //根据MAP的SIZE为高以及LIST的SIZE为宽创建新的GRID
//解析JSON到GRID里面
for(var i = 0; i < ds_map_size(json_set); i++) //依次取出LIST
{
tmp_list = ds_map_find_value(json_set, string(i));
for(var j = 0; j < ds_list_size(tmp_list); j++) //依次把LIST的值放入GRID
{
ds_grid_set(global.grid_set, j, i, real(ds_list_find_value(tmp_list, j)))
}
}
#endregion
#region 最终释放临时变量
//释放临时变量
ds_map_destroy(json_set);
ds_list_destroy(tmp_list);
#endregion
本次教程到此结束,有任何疑问和意见可以留言或者Q群询问,未经允许禁止转载
教程中源文件:点击下载
提取密码:hc69
解压密码:gmlearn.cn
网友评论