如何使Json.stringify忽略某些类成员?

问题描述 投票:1回答:2

我正在使用最新的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忽略某些成员?

json haxe
2个回答
1
投票

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}
    

0
投票

根据您的实际情况,可能需要对标准库的JsonPrinter进行稍加修改的版本-例如,在GMEdit中,我允许JSON对象具有一个hxOrder: Array<String>字段,如果提供了该字段,则该字段确定该字段的顺序打印,并初始化为静态数组。您可以为字段包含/排除创建类似的方案。

© www.soinside.com 2019 - 2024. All rights reserved.