Как проанализировать json файл с типом std :: необязательный <std :: variable> в C ++? - PullRequest
0 голосов
/ 11 марта 2020

Как я могу разобрать ввод json внутри этого файла, особенно для свойств secondary?

https://github.com/smogon/pokemon-showdown/blob/master/data/moves.js

Они составлены типами optional и variant.

Хотя только полный пример может выявить проблему в более ясный способ, минимальным примером для начала будет следующий:

    [
      {},
      {
        "secondary": false
      },
      {

        "secondary": {
          "chance": 10,
          "boosts": {
            "spd": -1
          }
        }
      },
      {
        "secondary": {
          "chance": 30,
          "volatileStatus": "flinch"
        }
      },
      {
        "secondary": {
          "chance": 30
        }
      },
      {
        "secondary": {
          "chance": 10,
          "self": {
            "boosts": {
              "atk": 1,
              "def": 1,
              "spa": 1,
              "spd": 1,
              "spe": 1
            }
          }
        }
      },
      {
        "secondary": {
          "chance": 10,
          "status": "brn"
        }
      },
      {
        "secondary": {
          "chance": 50,
          "self": {
            "boosts": {
              "def": 2
            }
          }
        }
      },
      {
        "secondary": {
          "chance": 100,
          "self": {}
        }
      },
      {
        "secondary": {
          "chance": 50,
          "boosts": {
            "accuracy": -1
          }
        }
      }
    ]

Для вашего удобства , вы можете прикрепить этот фрагмент к концу файла js и запустить его используя node move.js. Два действительных json файла будут сохранены на вашем диске. Один из них представляет собой список json объектов, в то время как другой является объектом со строкой в ​​качестве ключа.

var fs = require('fs');
fs.writeFile("moves_object.json", JSON.stringify(BattleMovedex), function(err) {}); // 1. save a json object with string key

var jsonList = []
for (var key of Object.keys(BattleMovedex)) {
    jsonList.push(BattleMovedex[key]);
}
fs.writeFile("moves.json", JSON.stringify(jsonList), function(err) { // 2. save as a list of json object
    if (err) {
        console.log(err);
    }
});

В c ++ (17/20) здесь есть предыдущие попытки:
https://github.com/nlohmann/json/issues/1281

https://github.com/nlohmann/json/issues/1910

https://github.com/nlohmann/json/issues/1261

Вот котельная плита Заботясь о простых необязательных полях, вы можете начать с:

struct Boosts {
    optional<int> atk;
    optional<int> def;
};

struct Self {
    optional<Boosts> boosts;
};
struct Secondary {
    optional<int> chance;
    optional<string> volatileStatus;
    optional<Boosts> boosts;
    optional<Self> self;
    optional<string> status;
};

struct move_t {
    int num;
    variant<bool, int> accuracy;
    int basePower;
    string category;
    optional<string> desc = std::nullopt;
    string shortDesc;
    string id;
    string name;
    optional<variant<bool, Secondary>> secondary;

};

1 Ответ

0 голосов
/ 11 марта 2020

Я бы предпочел (ab) использовать 'std :: monostate' в качестве аргумента 1-го типа для 'std :: variable', чем использовать 'std :: option' для 'std :: variable'. Если вариант содержит моностат, это означает пустой вариант. Кстати, зачем изобретать велосипед, пока доступно 'boost :: property_tree'?

https://www.boost.org/doc/libs/1_72_0/doc/html/property_tree.html

...