我正在使用最新的Haxe和HaxeFlixel制作简单的游戏原型。
我有以下课程...
class GameData
{
public var playerHealth: Int;
public var playerScore: Int;
public var levelName: String;
public function new(playerHealth: Int = 0, playerScore: Int = 0, levelName: String = "")
{
this.playerHealth = playerHealth;
this.playerScore = playerScore;
this.levelName = levelName;
}
}
我如下将其转换为JSON ...
Json.stringify(new GameData(64, 512, "Level 1"));
有没有一种方法可以使stringify忽略某些成员?
haxe.Json
没有排除字段的机制,因此我建议使用第三方库,例如json2object。在这里,您可以简单地用@:jignored
注释应忽略的字段:
@:jignored
public var levelName:String;
var data = new GameData(100, 10, "Level 1");
var json = new json2object.JsonWriter<GameData>().write(data);
trace(json); // {"playerHealth": 100,"playerScore": 10}
[有些可能的解决方法不涉及向您的项目中添加库,但是它们看起来不太好:
不直接序列化对象,而是仅包含所需字段的结构:
var data = new GameData(100, 10, "Level 1");
var json = Json.stringify({
playerHealth: data.playerHealth,
playerScore: data.playerScore
});
trace(json); // {"playerHealth":100,"playerScore":10}
序列化后删除不需要的字段-这似乎很麻烦,因为额外的Json.parse()
和Json.stringify()
调用会涉及很多不必要的开销:
var json = Json.stringify(new GameData(100, 10, "Level 1"));
var data:haxe.DynamicAccess<String> = Json.parse(json);
data.remove("levelName");
json = Json.stringify(data);
trace(json); // {"playerHealth":100,"playerScore":10}
根据您的实际情况,可能需要对标准库的JsonPrinter进行稍加修改的版本-例如,在GMEdit中,我允许JSON对象具有一个hxOrder: Array<String>
字段,如果提供了该字段,则该字段确定该字段的顺序打印,并初始化为静态数组。您可以为字段包含/排除创建类似的方案。