// Copyright Epic Games, Inc. All Rights Reserved. #include "Dom/JsonObject.h" void FJsonObject::SetField(FString&& FieldName, const TSharedPtr& Value) { this->Values.Add(MoveTemp(FieldName), Value); } void FJsonObject::SetField(const FString& FieldName, const TSharedPtr& Value) { SetField(CopyTemp(FieldName), Value); } void FJsonObject::RemoveField(FStringView FieldName) { this->Values.RemoveByHash(GetTypeHash(FieldName), FieldName); } double FJsonObject::GetNumberField(FStringView FieldName) const { return GetField(FieldName)->AsNumber(); } bool FJsonObject::TryGetNumberField(FStringView FieldName, float& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, double& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, int8& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, int16& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, int32& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, int64& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, uint8& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, uint16& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, uint32& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } bool FJsonObject::TryGetNumberField(FStringView FieldName, uint64& OutNumber) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetNumber(OutNumber); } void FJsonObject::SetNumberField(FString&& FieldName, double Number) { this->Values.Add(MoveTemp(FieldName), MakeShared(Number)); } void FJsonObject::SetNumberField(const FString& FieldName, double Number) { SetNumberField(CopyTemp(FieldName), Number); } FString FJsonObject::GetStringField(FStringView FieldName) const { return GetField(FieldName)->AsString(); } FUtf8String FJsonObject::GetUtf8StringField(FStringView FieldName) const { return GetField(FieldName)->AsUtf8String(); } bool FJsonObject::TryGetStringField(FStringView FieldName, FString& OutString) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetString(OutString); } bool FJsonObject::TryGetStringArrayField(FStringView FieldName, TArray& OutArray) const { TSharedPtr Field = TryGetField(FieldName); if (!Field.IsValid()) { return false; } const TArray< TSharedPtr > *Array; if (!Field->TryGetArray(Array)) { return false; } for (int Idx = 0; Idx < Array->Num(); Idx++) { FString Element; if (!(*Array)[Idx]->TryGetString(Element)) { return false; } OutArray.Add(Element); } return true; } void FJsonObject::SetStringField(FString&& FieldName, FString&& StringValue) { this->Values.Add(MoveTemp(FieldName), MakeShared>(MoveTemp(StringValue))); } void FJsonObject::SetStringField(FString&& FieldName, const FString& StringValue) { SetStringField(MoveTemp(FieldName), CopyTemp(StringValue)); } void FJsonObject::SetStringField(const FString& FieldName, FString&& StringValue) { SetStringField(CopyTemp(FieldName), MoveTemp(StringValue)); } void FJsonObject::SetStringField(const FString& FieldName, const FString& StringValue) { SetStringField(CopyTemp(FieldName), CopyTemp(StringValue)); } void FJsonObject::SetStringField(FString&& FieldName, FUtf8String&& StringValue) { this->Values.Add(MoveTemp(FieldName), MakeShared>(MoveTemp(StringValue))); } void FJsonObject::SetStringField(FString&& FieldName, const FUtf8String& StringValue) { SetStringField(MoveTemp(FieldName), CopyTemp(StringValue)); } void FJsonObject::SetStringField(const FString& FieldName, FUtf8String&& StringValue) { SetStringField(CopyTemp(FieldName), MoveTemp(StringValue)); } void FJsonObject::SetStringField(const FString& FieldName, const FUtf8String& StringValue) { SetStringField(CopyTemp(FieldName), CopyTemp(StringValue)); } bool FJsonObject::GetBoolField(FStringView FieldName) const { return GetField(FieldName)->AsBool(); } bool FJsonObject::TryGetBoolField(FStringView FieldName, bool& OutBool) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetBool(OutBool); } void FJsonObject::SetBoolField(FString&& FieldName, bool InValue) { this->Values.Add(MoveTemp(FieldName), MakeShared(InValue)); } void FJsonObject::SetBoolField(const FString& FieldName, bool InValue) { SetBoolField(CopyTemp(FieldName), InValue); } const TArray>& FJsonObject::GetArrayField(FStringView FieldName) const { return GetField(FieldName)->AsArray(); } bool FJsonObject::TryGetArrayField(FStringView FieldName, const TArray>*& OutArray) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetArray(OutArray); } void FJsonObject::SetArrayField(FString&& FieldName, TArray>&& Array) { this->Values.Add(MoveTemp(FieldName), MakeShared(MoveTemp(Array))); } void FJsonObject::SetArrayField(FString&& FieldName, const TArray>& Array) { SetArrayField(MoveTemp(FieldName), CopyTemp(Array)); } void FJsonObject::SetArrayField(const FString& FieldName, TArray>&& Array) { SetArrayField(CopyTemp(FieldName), MoveTemp(Array)); } void FJsonObject::SetArrayField(const FString& FieldName, const TArray>& Array) { SetArrayField(CopyTemp(FieldName), CopyTemp(Array)); } const TSharedPtr& FJsonObject::GetObjectField(FStringView FieldName) const { return GetField(FieldName)->AsObject(); } bool FJsonObject::TryGetObjectField(FStringView FieldName, const TSharedPtr*& OutObject) const { TSharedPtr Field = TryGetField(FieldName); return Field.IsValid() && Field->TryGetObject(OutObject); } void FJsonObject::SetObjectField(FString&& FieldName, const TSharedPtr& JsonObject) { if (JsonObject.IsValid()) { this->Values.Add(MoveTemp(FieldName), MakeShared(JsonObject.ToSharedRef())); } else { this->Values.Add(MoveTemp(FieldName), MakeShared()); } } void FJsonObject::SetObjectField(const FString& FieldName, const TSharedPtr& JsonObject) { SetObjectField(CopyTemp(FieldName), JsonObject); } SIZE_T FJsonObject::GetAllocatedSize() const { SIZE_T SizeBytes = 0; SizeBytes += Values.GetAllocatedSize(); for (const TPair>& KV : Values) { SizeBytes += KV.Key.GetAllocatedSize(); SizeBytes += KV.Value.IsValid() ? KV.Value->GetMemoryFootprint() : 0; } return SizeBytes; } void FJsonObject::Duplicate(const TSharedPtr& Source, const TSharedPtr& Dest) { if (Source && Dest) { for (const TPair>& Pair : Source->Values) { Dest->SetField(Pair.Key, FJsonValue::Duplicate(Pair.Value)); } } } void FJsonObject::Duplicate(const TSharedPtr& Source, TSharedPtr& Dest) { Duplicate(ConstCastSharedPtr(Source), Dest); }