如何让 Json.stringify 忽略某些 class 成员?
How to make Json.stringify ignore certain class memebers?
我正在使用最新的 Haxe 和 HaxeFlixel 制作一个简单的游戏原型。
我有以下 class...
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>
字段,这,如果提供,确定打印的字段顺序,并初始化为静态数组。您可以为字段 inclusion/exclusion.
制定类似的方案
我正在使用最新的 Haxe 和 HaxeFlixel 制作一个简单的游戏原型。
我有以下 class...
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>
字段,这,如果提供,确定打印的字段顺序,并初始化为静态数组。您可以为字段 inclusion/exclusion.