Files
UnrealEngine/Engine/Source/Runtime/Json/Private/Dom/JsonObject.cpp
2025-05-18 13:04:45 +08:00

291 lines
8.2 KiB
C++

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