cereal-UE4でJSONデータを読み込む

はじめに

https://crssnky.hatenablog.jp/entry/2021/BMD

↑の子記事となっています。記事の背景を知る場合はこちらから参照ください。

データ

github.com

実は、北朝鮮のミサイル実験のJSONデータはこのリポジトリにまとまっています。
このリポジトリは、元々Webアプリケーションとしてミサイル実験の可視化を行うプロダクト(ReadMe参照)のものですが、そこに使われているものがよくまとまっており、定期的に更新もされているため非常に使いやすいです。
本プロジェクトでは、

  • test.ja.json(各実験概要)
  • missile.ja.json(ミサイルリスト)
  • facility.ja.json(施設...ですが、分かりやすく言えば発射地点リスト)

を読み取ります。

ライブラリ

読み取りに使うのは、cerealというC++JSONライブラリです。UE4で扱うため、cereal-UE4も追加で入れます。
使い方は、伊藤兎さんのcereal-UE4に関する記事を読むと分かりやすいです。

GitHub - USCiLab/cereal: A C++11 library for serialization

GitHub - usagi/cereal-UE4: cereal ( C++ serialization library ) adapter for UE4 ( Unreal Engine ) types

usagi.hatenablog.jp

元データは以下のような形のため、C++で非常に解釈しづらいです。

{
    "er-scud": {"name": "スカッドER", "type": "MRBM"},   // keyに名前が入っている
    "hwasong-12": {"name": "火星12号", "type": "IRBM"}, 
    ....
}

ですので、自前で良い感じに整形してから(前処理として)、C++で読み込んでいます。

{
  "root": {
    "missiles": [
      {
        "key": "er-scud",   // 名前をvalue側に移した
        "name": "スカッドER",
        "type": "MRBM"
      },
      {
        "key": "hwasong-12",
        "name": "火星12号",
        "type": "IRBM"
      },
      ....
}

これならば、以下のC++で読めますね。

USTRUCT(BlueprintType)
struct FMissile {
    GENERATED_BODY()
        UPROPERTY(BlueprintReadWrite, Category = "MissileTest")
        FString key;
    UPROPERTY(BlueprintReadWrite, Category = "MissileTest")
        FString name;
    UPROPERTY(BlueprintReadWrite, Category = "MissileTest")
        FString type;
};
template<typename T>
void serialize(T& a, FMissile& in) {
    a(
        make_nvp("name", in.name),
        make_nvp("key", in.key),
        make_nvp("type", in.type)
    );
}

おわりに

UE4JSONを解釈するための、個人的BestWayでした。伊藤兎さんの記事にある通り、標準機能はBestではないためこちらを利用することをおすすめします。