본문 바로가기
Unreal/기본

[Unreal] Json 사용법

by 카피마스터 2024. 8. 23.

Build.cs에 Json 모듈을 추가 

PublicDependencyModulesNames.AddRange(new string[] { ..., "Json"});

 

 

Json 형태

{
	"Name": "Ogre",
	"HP": 25,
	"IsKing": true,
	"ItemList": [
		"item1",
		"item2",
		"item3"
	]
}

 

Json 정보 파일에 쓰기

TSharedPtr<FJsonObject> jsonObject = MakeShareable(new FJsonObject());

jsonObject->SetStringField(TEXT("Name"), TEXT("Ogre"));
jsonObject->SetNumberField(TEXT("HP"), 25);
jsonObject->SetBoolField(TEXT("IsKing"), true);

// 배열 설정
TArray<TSharedPtr<FJsonValue>> ItemList;
ItemList.Add(MakeShareable(new FJsonValueString(TEXT("item1"))));
ItemList.Add(MakeShareable(new FJsonValueString(TEXT("item2"))));
ItemList.Add(MakeShareable(new FJsonValueString(TEXT("item3"))));
jsonObject->SetArrayField(TEXT("ItemList"), ItemList);


bool flag = false;

// Json을 문자열로 변환
FString strJson;
TSharedRef<TJsonWriter<>> jsonWriter = TJsonWriterFactory<>::Create(&strJson);
flag = FJsonSerializer::Serialize(jsonObject.ToSharedRef(), jsonWriter);
if (false == flag) 
{
	// json을 문자열로 변환 실패
	return;
}

FString dirPath = FPaths::ProjectPersistentDownloadDir();
FString filePath = FPaths::Combine(dirPath, TEXT("TestJson.json"));

// 문자열 저장
flag = FFileHelper::SaveStringToFile(strJson, *filePath);
if (false == flag)
{
	// 저장 실패
	return;
}

 

 

파일에서 Json 정보 읽기

FString dirPath = FPaths::ProjectPersistentDownloadDir();
FString filePath = FPaths::Combine(dirPath, TEXT("TestJson.json"));

bool flag = false;

// 파일에서 json 스트링을 얻는다
FString strJson;
flag = FFileHelper::LoadFileToString(strJson, *filePath);
if (false == flag) 
{
	// json 파일읽기 실패
	return;	
}

// 성공
TSharedRef<TJsonReader<>> jsonReader = TJsonReaderFactory<>::Create(strJson);

// json 스트링을 object로 변환
TSharedPtr<FJsonObject> jsonObject;
flag = FJsonSerializer::Deserialize(jsonReader, jsonObject) && jsonObject.IsValid();
if (false == flag) 
{
	// 변환 실패
	return; 
}

// 정보를 추출
FString name = jsonObject->GetStringField(TEXT("Name"));
double hp = jsonObject->GetNumberField(TEXT("HP"));
bool isKing = jsonObject->GetBoolField(TEXT("IsKing"));

// 배열 정보를 얻는다
const TArray<TSharedPtr<FJsonValue>>* jsonValueList;
if (jsonObject->TryGetArrayField(TEXT("itemList"), jsonValueList))
{
	// 루프를 돌면서 값을 얻는다
	for (const TSharedPtr<FJsonValue>& jsonValue : *jsonValueList)
	{
		FString item = jsonValue->AsString();
	}
}