// Copyright Epic Games, Inc. All Rights Reserved. #include "Serialization/JsonSerializerReader.h" #include "Dom/JsonValue.h" FJsonSerializerReader::FJsonSerializerReader(TSharedPtr InJsonObject) : JsonObject(InJsonObject) { } FJsonSerializerReader::~FJsonSerializerReader() { } bool FJsonSerializerReader::IsLoading() const { return true; } bool FJsonSerializerReader::IsSaving() const { return false; } TSharedPtr FJsonSerializerReader::GetObject() { return JsonObject; } void FJsonSerializerReader::StartObject() { // Empty on purpose } void FJsonSerializerReader::StartObject(FStringView Name) { // Empty on purpose } void FJsonSerializerReader::EndObject() { // Empty on purpose } void FJsonSerializerReader::StartArray() { // Empty on purpose } void FJsonSerializerReader::StartArray(FStringView Name) { // Empty on purpose } void FJsonSerializerReader::EndArray() { // Empty on purpose } void FJsonSerializerReader::Serialize(FStringView Name, int32& Value) { if (JsonObject->HasTypedField(Name)) { JsonObject->TryGetNumberField(Name, Value); } } void FJsonSerializerReader::Serialize(FStringView Name, uint32& Value) { if (JsonObject->HasTypedField(Name)) { JsonObject->TryGetNumberField(Name, Value); } } void FJsonSerializerReader::Serialize(FStringView Name, int64& Value) { if (JsonObject->HasTypedField(Name)) { JsonObject->TryGetNumberField(Name, Value); } } void FJsonSerializerReader::Serialize(FStringView Name, bool& Value) { if (JsonObject->HasTypedField(Name)) { Value = JsonObject->GetBoolField(Name); } } void FJsonSerializerReader::Serialize(FStringView Name, FString& Value) { if (JsonObject->HasTypedField(Name)) { Value = JsonObject->GetStringField(Name); } } void FJsonSerializerReader::Serialize(FStringView Name, FUtf8String& Value) { if (JsonObject->HasTypedField(Name)) { Value = JsonObject->GetUtf8StringField(Name); } } void FJsonSerializerReader::Serialize(FStringView Name, FText& Value) { if (JsonObject->HasTypedField(Name)) { Value = FText::FromString(JsonObject->GetStringField(Name)); } } void FJsonSerializerReader::Serialize(FStringView Name, float& Value) { if (JsonObject->HasTypedField(Name)) { Value = (float)JsonObject->GetNumberField(Name); } } void FJsonSerializerReader::Serialize(FStringView Name, double& Value) { if (JsonObject->HasTypedField(Name)) { Value = JsonObject->GetNumberField(Name); } } void FJsonSerializerReader::Serialize(FStringView Name, FDateTime& Value) { if (JsonObject->HasTypedField(Name)) { FDateTime::ParseIso8601(*JsonObject->GetStringField(Name), Value); } } void FJsonSerializerReader::Serialize(FStringView Name, JsonSimpleValueVariant& InVariant) { TSharedPtr FieldValue = JsonObject->TryGetField(Name); if (FieldValue.IsValid()) { InVariant = UE::Json::ToSimpleJsonVariant(*FieldValue); } } void FJsonSerializerReader::SerializeArray(FJsonSerializableArray& Array) { // @todo - higher level serialization is expecting a Json Object check(0 && TEXT("Not implemented")); } void FJsonSerializerReader::SerializeArray(FStringView Name, FJsonSerializableArray& Array) { if (JsonObject->HasTypedField(Name)) { TArray< TSharedPtr > JsonArray = JsonObject->GetArrayField(Name); // Iterate all of the keys and their values for (TSharedPtr& Value : JsonArray) { Array.Add(Value->AsString()); } } } void FJsonSerializerReader::SerializeArray(FStringView Name, FJsonSerializableArrayInt& Array) { if (JsonObject->HasTypedField(Name)) { TArray< TSharedPtr > JsonArray = JsonObject->GetArrayField(Name); // Iterate all of the keys and their values for (TSharedPtr& Value : JsonArray) { Array.Add((int32)Value->AsNumber()); } } } void FJsonSerializerReader::SerializeArray(FStringView Name, FJsonSerializableArrayFloat& Array) { if (JsonObject->HasTypedField(Name)) { TArray< TSharedPtr > JsonArray = JsonObject->GetArrayField(Name); // Iterate all of the keys and their values for (TSharedPtr& Value : JsonArray) { Array.Add((float)Value->AsNumber()); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeyValueMap& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { Map.Add(Pair.Key, Pair.Value->AsString()); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeyValueMapInt& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { const int32 Value = (int32)Pair.Value->AsNumber(); Map.Add(Pair.Key, Value); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeyValueMapArrayInt& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { FJsonSerializableArrayInt TempArray; for (const TSharedPtr& ArrayValue : Pair.Value->AsArray()) { int32 IntValue; if (ArrayValue.IsValid() && ArrayValue->TryGetNumber(IntValue)) { TempArray.Add(IntValue); } } Map.Add(Pair.Key, TempArray); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeyValueMapInt64& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { const int64 Value = (int64)Pair.Value->AsNumber(); Map.Add(Pair.Key, Value); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeyValueMapFloat& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { const float Value = (float)Pair.Value->AsNumber(); Map.Add(Pair.Key, Value); } } } void FJsonSerializerReader::SerializeMap(FStringView Name, FJsonSerializableKeySimpleValueVariantMap& Map) { if (JsonObject->HasTypedField(Name)) { TSharedPtr JsonMap = JsonObject->GetObjectField(Name); // Iterate all of the keys and their values for (const TPair>& Pair : JsonMap->Values) { if (Pair.Value.IsValid()) { Map.Add(Pair.Key, UE::Json::ToSimpleJsonVariant(*Pair.Value)); } } } } void FJsonSerializerReader::SerializeSimpleMap(FJsonSerializableKeyValueMap& Map) { // Iterate all of the keys and their values, only taking simple types (not array/object), all in string form for (auto KeyValueIt = JsonObject->Values.CreateConstIterator(); KeyValueIt; ++KeyValueIt) { FString Value; if (KeyValueIt.Value()->TryGetString(Value)) { Map.Add(KeyValueIt.Key(), MoveTemp(Value)); } } } void FJsonSerializerReader::SerializeMapSafe(FStringView Name, FJsonSerializableKeyValueMap& Map) { if (JsonObject->HasTypedField(Name)) { // Iterate all of the keys and their values, only taking simple types (not array/object), all in string form TSharedPtr JsonMap = JsonObject->GetObjectField(Name); for (const TPair>& Pair : JsonMap->Values) { FString Value; if (Pair.Value->TryGetString(Value)) { Map.Add(Pair.Key, MoveTemp(Value)); } } } } void FJsonSerializerReader::WriteIdentifierPrefix(FStringView Name) { // Should never be called on a reader check(false); } void FJsonSerializerReader::WriteRawJSONValue(FStringView Value) { // Should never be called on a reader check(false); } void FJsonSerializerReader::WriteRawJSONValue(FUtf8StringView Value) { // Should never be called on a reader check(false); }