BLOGブログ

2017.12.08UE4/ C++

[UE4][C++]FJsonSerializebleマクロを使ってみる

データ通信で使われたり、オリジナルデータのフォーマットとして使われるJSONですが
UE4でJSONを扱う場合はFJsonObjectを使用して各フィールドごとに追加・取得し、シリアライズ・デシリアライズを行います。

開発で扱う場合、仕様が変わりパラメータが増えるたびにソースコードを追加する作業が発生します。
今回紹介するFJsonSerializable構造体を使うと必要なマクロを書くだけでJSONの変換する処理が自動生成されるようになり、
フィールドが増えるたびにソースコードを追加する必要がなくなります。

使用方法
必要なモジュール
「Json」をModuleRules(拡張子.Build.csのファイル)に追加
必要なヘッダーファイル

構造体の宣言・マクロの書き方

BEGIN_JSON_SERIALIZER
JSON_SERIALIZE(“value0”, value0);
JSON_SERIALIZE(“value1”, value1);
END_JSON_SERIALIZER

FJSONItem():
value0(0)
,value1(1)
{
}
};

JSON形式文字列に変換

JSON形式文字列から構造体に変換

一応JSON側データがなかった場合は初期値が入るようですので初期値は入れたほうがデータ破損のチェックに使えるかと思います。

使える変数型

  • int32
  • uint32
  • bool
  • FString
  • FText
  • float
  • double
  • FDateTime

※列挙体(Enum)、64bit整数は使えないため変数型の変換が必要となります。

FJsonSerializableを継承した構造体であれば配列も使えます。
JSON_SERIALIZE_ARRAY_SERIALIZABLEマクロで宣言して下さい。

BEGIN_JSON_SERIALIZER
JSON_SERIALIZE(“value0”, value0);
JSON_SERIALIZE(“value1”, value1);
END_JSON_SERIALIZER

FJSONItem():
value0(0)
,value1(1)
{
}
};

struct FJSONArrayItems : public FJsonSerializable
{
TArray Items;

BEGIN_JSON_SERIALIZER
JSON_SERIALIZE_ARRAY_SERIALIZABLE(“Items”, Items,FJSONItem);
END_JSON_SERIALIZER
};

注意点としてブループリントではそのままでは使えません。
※USTRUCT UCLASSマクロの使用をするとビルドエラーになってしまいます。
ですので、ブループリントで使用したい場合はUSTRUCT(BlueprintType)で宣言した
同じプロパティを持った構造体を宣言する必用があります。

参考にしてもらえたら幸いです。