⭐ Game Programming/Unreal Document

[언리얼엔진] Json 파일 로드하기

테디슨 2022. 10. 6. 22:06

개요

언리얼 엔진에서 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/

반응형