cereal-UE4でJSONデータを読み込む
はじめに
https://crssnky.hatenablog.jp/entry/2021/BMD
↑の子記事となっています。記事の背景を知る場合はこちらから参照ください。
データ
実は、北朝鮮のミサイル実験のJSONデータはこのリポジトリにまとまっています。
このリポジトリは、元々Webアプリケーションとしてミサイル実験の可視化を行うプロダクト(ReadMe参照)のものですが、そこに使われているものがよくまとまっており、定期的に更新もされているため非常に使いやすいです。
本プロジェクトでは、
を読み取ります。
ライブラリ
読み取りに使うのは、cerealというC++のJSONライブラリです。UE4で扱うため、cereal-UE4も追加で入れます。
使い方は、伊藤兎さんのcereal-UE4に関する記事を読むと分かりやすいです。
GitHub - USCiLab/cereal: A C++11 library for serialization
元データは以下のような形のため、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) ); }
おわりに
UE4でJSONを解釈するための、個人的BestWayでした。伊藤兎さんの記事にある通り、標準機能はBestではないためこちらを利用することをおすすめします。