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

    개요

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

    반응형

    댓글

    Designed by JB FACTORY