【问题标题】:How to make Json.stringify ignore certain class memebers?如何让 Json.stringify 忽略某些类成员?
【发布时间】:2020-01-26 07:41:28
【问题描述】:

我正在使用最新的 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


    【解决方案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}
      

    【讨论】:

    • 真的没有想过序列化只包含所需字段的结构的想法,非常感谢您的帮助!
    【解决方案2】:

    根据您的具体情况,可能需要对标准库的 JsonPrinter 进行稍微修改的版本 - 例如,在 GMEdit 中,我允许 JSON 对象具有 hxOrder: Array&lt;String&gt; 字段,如果提供,则确定字段顺序用于打印,并初始化为静态数组。您可以为字段包含/排除制定类似的方案。

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2018-03-10
      • 2012-08-21
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多