Как заставить Json .stringify игнорировать некоторые члены класса? - PullRequest
1 голос
/ 26 января 2020

Я использую новейшие 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 игнорировал определенных членов?

Ответы [ 2 ]

3 голосов
/ 26 января 2020

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}
    
1 голос
/ 27 января 2020

В зависимости от вашей конкретной ситуации, может быть желательно сделать слегка модифицированную версию JsonPrinter стандартной библиотеки - например, в GMEdit я позволяю JSON объектам иметь поле hxOrder: Array<String>, которое, если оно предусмотрено, определяет порядок полей для печати и инициализируется в массив stati c. Вы можете сделать аналогичную схему для включения / исключения поля.

...