関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2017.12.08UE4UE/ C++
データ通信で使われたり、オリジナルデータのフォーマットとして使われるJSONですが
UE4でJSONを扱う場合はFJsonObjectを使用して各フィールドごとに追加・取得し、シリアライズ・デシリアライズを行います。
開発で扱う場合、仕様が変わりパラメータが増えるたびにソースコードを追加する作業が発生します。
今回紹介するFJsonSerializable構造体を使うと必要なマクロを書くだけでJSONの変換する処理が自動生成されるようになり、
フィールドが増えるたびにソースコードを追加する必要がなくなります。
使用方法
必要なモジュール
「Json」をModuleRules(拡張子.Build.csのファイル)に追加
必要なヘッダーファイル
1 |
#include "Serialization/JsonSerializerMacros.h" |
構造体の宣言・マクロの書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
struct FJSONItem : public FJsonSerializable { int32 value0; int32 value1; BEGIN_JSON_SERIALIZER JSON_SERIALIZE("value0", value0); JSON_SERIALIZE("value1", value1); END_JSON_SERIALIZER FJSONItem() : value0(0) , value1(1) { } }; |
JSON形式文字列に変換
1 |
FString JsonStr = JsonItem.ToJson(); |
JSON形式文字列から構造体に変換
1 |
JsonItem.FromJson(JsonStr); |
一応JSON側データがなかった場合は初期値が入るようですので初期値は入れたほうがデータ破損のチェックに使えるかと思います。
使える変数型
※列挙体(Enum)、64bit整数は使えないため変数型の変換が必要となります。
FJsonSerializableを継承した構造体であれば配列も使えます。
JSON_SERIALIZE_ARRAY_SERIALIZABLEマクロで宣言して下さい。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
struct FJSONItem : public FJsonSerializable { Int32 value0; int32 value1; 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)で宣言した
同じプロパティを持った構造体を宣言する必用があります。
参考にしてもらえたら幸いです。