如何让 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.

制定类似的方案