[언리얼엔진] Json 파일 로드하기
- ⭐ Game Programming/Unreal Document
- 2022. 10. 6.
개요
언리얼 엔진에서 Json 포멧의 파일을 읽어들이는 방법을 알아보자
설정
[projectname].build.cs 프로젝트에서 Json 모듈을 추가하자
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
public class MyProject : ModuleRules
{
public MyProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Json" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
예제 파일
{
"name" : "Kim"
"level" : 20,
"items" : [
{
"itemid" : 100,
"count" : 3,
}
{
"itemid" : 200,
"count" : 1,
}
]
"skills" : [
"fireball",
"icebolt",
]
}
파싱
FFileHelper를 통해 파일을 문자열로 읽어들이고 TJsonReader를 통해 JsonObject로 Deserialize 할수 있다. 이후 JsonObject를 통해 각 필드를 읽어 들이자.
FString FileStr;
FString FilePath = TEXT("path/test.json");
FFileHelper::LoadFileToString(FileStr, *FilePath);
TSharedRef<TJsonReader<TCHAR>> jsonReader = TJsonReaderFactory<TCHAR>::Create(FileStr);
TSharedPtr<FJsonObject> jsonObj = MakeShareable(new FJsonObject());
if (FJsonSerializer::Deserialize(jsonReader, jsonObj) && jsonObj.IsValid())
{
FString CharName;
jsonObj->TryGetStringField(TEXT("name"), CharName);
int32 Level;
jsonObj->TryGetNumberField(TEXT("level"), Level);
TArray<FItemData> ItemDatas;
const TArray<TSharedPtr<FJsonValue>>* jsonItems;
if(JsonObject->TryGetArrayField(TEXT("items"), jsonItems))
{
for(int i = 0; i < jsonItems.Num(); i++)
{
TSharedPtr<FJsonObject> jsonItem = jsonItems[i]->AsObject();
FItemData AddData;
jsonItem->TryGetNumberField(TEXT("itemid"), AddData.ItemID);
jsonItem->TryGetNumberField(TEXT("count"), AddData.count);
ItemDatas.Add(AddData);
}
}
TArray<FString> Skills;
JsonObject->TryGetStringArrayField(TEXT("skills"), Skills);
}
데이터 로드 함수
데이터 종류는 객체, 숫자, 문자열, 배열 등으로 읽어들일 수 있다. GetField 함수와 TryGetField 함수가 있는데 TryGetField 함수를 사용하도록 하자.
// 숫자로 로드
int32 iValue; //double, float, int16, int32, int64 등등 가능
if(JsonObject->TryGetNumberField(TEXT("fieldname"), iValue))
{
// TODO
}
// 문자열로 로드
FString StrValue;
if(JsonObject->TryGetStringField(TEXT("fieldname"), StrValue))
{
// TODO
}
// JsonObject로 로드
const TSharedPtr<FJsonObject>* JsonObject;
if(JsonObject->TryGetObjectField(TEXT("fieldname"), JsonObject))
{
// TODO
}
// 배열로 로드
const TArray<TSharedPtr<FJsonValue>>* ArrValue;
if(JsonObject->TryGetArrayField(TEXT("fieldname"), ArrValue))
{
// TODO
}
문서
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Json/Dom/FJsonObject/
FJsonValue
FJsonValue는 아직 타입이 정해지지 않은 값이며 다른타입으로 변환해서 파싱해야 한다.
bool bValue = JsonValue.AsBool();
FString StrValue = JsonValue.AsString();
double dValue = JSonValue.AsNumber();
TSharedPtr<FJsonObject> JsonObject = JsonValue.AsObject();
TArray<TSharedPtr<FJsonValue>> Values = JsonValue.AsArray();
문서
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Json/Dom/FJsonValue/
반응형