关于json的使用

JSON 是一种在各种开发过程中十分常用的轻量化数据格式,我之前也曾经介绍过用 JSON 来实现游戏存档机制的方法,而在 GameMaker 更新支持 Struct 结构体后也引入了新的 JSON 函数,个人感觉现在 GameMaker 使用 JSON 数据会比以前用 DS MAP 做转换更直观。

在 GameMaker 中可以使用json_encode()把 DS MAP 中的数据转换成 JSON ,或使用 json_stringify() 把一个 Struct 中的数据转换成 JSON ,另外有对应的 json_decode()json_parse()函数可以将 JSON 转换成 DS MAP 或 Struct。

但是当使用 json_stringify() 把一个结构体数据转换成 JSON 时,如果结构体中有整数数据,在最终生成的 JSON 数据中,这个数会变成一个浮点数,即会在数字末尾多一个“.0”

示例

body = {
    name : "ralph",
    age : 3
}

如果使用json_stringify(body)来输出结果则会是

{"name" : "ralph" , "age" : 3.0 }

使用 json_encode() 转换 DS MAP 数据也会遇到相同问题

当然,使用 json_parse()把数据转换回去的时浮点数也会变回整数,因此在很多时候,如果你只是把 JSON 和结构体拿来当作一些数据的存取对象是不会遇到什么问题的。但如果遇到一些需要校验数据一致性的场合可能就会踩坑,比如许多开放平台的鉴权都会要求对 header 或请求的数据就可能会出现问题。

解决方案

要避免这种情况可以把对应的值用int64()强制转换一下

body = {
    name : "ralph",
    age : int64(3)
}
show_debug_message(json_stringify(body));

输出如下

{ "name": "ralph", "age": 3 }

但当这个数值比较大时就会失效(我没测出具体的数值,大概十一二位的数就不行了),在官方的 market 里有一个专门处理 JSON 和 Struct 数值的免费插件,功能比自带的函数更强和丰富,也可以解决这个问题,插件名称—— JSON Struct

下载地址:https://marketplace.yoyogames.com/assets/9441/json-struct

2022-08-23 23:16
Comments
Write a Comment