json

ue4¿¡¼­ json »ç¿ë ÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æ º»´Ù.

XXX.Build.cs ÆÄÀÏ¿¡ ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Json", "JsonUtilities" });

FJsonObjectConverter¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é "JsonUtilities"´Â Ãß°¡ ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.

Json ÆÄÀÏ °æ·Î ±¸Çϱâ

¾ð¸®¾ó ÇÁ·ÎÁ§Æ®¿¡¼­ mytest.jsonÀ̶ó´Â ÆÄÀÏÀ» °¡Á®¿Â´Ù.

//FilePath Test
#include "Misc/Paths.h"

FString TestFilePath()
{
    //FString MyFilePath = FPaths::ProjectConfigDir();
    FString FilePath = FPaths::ProjectDir();
    FilePath.Append(TEXT("mytest.json"));
    IPlatformFile& FileManager = FPlatformFileManager::Get().GetPlatformFile();

    if (FileManager.FileExists(*FilePath))
    {
        UE_LOG(LogTemp, Warning, TEXT("FilePaths: File found!"));
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("FilePaths: File not found!"));
    }

    return FilePath;
}

mytest.json ÆÄÀÏ ³»¿ë

{
    "name": "È« ±æµ¿",
    "age": 32,
    "arr": [1, 2, 3, 4]
}

jsonÀ» Àдµ¥ ÇÊ¿äÇÑ Çì´õ

//Json Test
#include "Misc/FileHelper.h"
#include "Serialization/JsonReader.h"
#include "Dom/JsonObject.h"
#include "Serialization/JsonSerializer.h"

±âº» Àбâ

json ÆÄÀÏÀ» Àд´Ù.
TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);

FJsonObject¸¦ »ý¼º ÇÑ´Ù.
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

Àоî¿Â µ¥ÀÌÅ͸¦ FJsonObject·Î ¿ªÁ÷·ÄÈ­ ÇÑ´Ù.
FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid()

°ªÀ» ¾ò¾î ¿Ã¶§´Â GetXXX ÇÔ¼ö¿Í TryGetXXX µÎ°¡Áö °è¿­ÀÇ ÇÔ¼ö°¡ ÀÖ´Ù.
TryGetStringField ÇÔ¼ö´Â Json¿¡ Å°°ªÀÌ ¾øÀ¸¸é ÇÒ´ç ÇÏÁö ¾Ê´Â´Ù. 

int age = JsonObject->GetIntegerField(TEXT("age"));
FString Name;
JsonObject->TryGetStringField("name", Name);

void AUmgListViewDemoGameModeBase::TestJson(const FString& FilePath)
{
    FString filePath = FilePath;
    FString jsonstr;
    FFileHelper::LoadFileToString(jsonstr, *filePath);   

    TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
    TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

    if (FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid())
    {
        int age = JsonObject->GetIntegerField(TEXT("age"));
        FString Name = JsonObject->GetStringField(TEXT("name"));

        //convert string
        FString OutputString;
        TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);
        FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);

        UE_LOG(LogTemp, Warning, TEXT("resulting jsonString -> %s"), *OutputString);
    }
}

Àüü JsonÀ» Ãâ·Â ÇÑ´Ù.

FString OutputString;
TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);

UE_LOG(LogTemp, Warning, TEXT("resulting jsonString -> %s"), *OutputString);

¹è¿­ Àбâ

¹è¿­À» ¼±¾ðÇÏ°í TryGetArrayField·Î ¹è¿­À» Àд´Ù.

const TArray<TSharedPtr<FJsonValue>>* list;       
bool res = JsonObject->TryGetArrayField(TEXT("arr"), list);

¹è¿­À» ´ÙÀ½°ú °°ÀÌ ¹Ýº¹ ó¸® ÇÑ´Ù.

for (TSharedPtr<FJsonValue> JsonItem : *list)

void AUmgListViewDemoGameModeBase::TestJson1(const FString& FilePath)
{
    FString jsonstr;
    FFileHelper::LoadFileToString(jsonstr, *FilePath);

    TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
    TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

    if (FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid())
    {
        const TArray<TSharedPtr<FJsonValue>>* list;
        bool res = JsonObject->TryGetArrayField(TEXT("arr"), list);
        for (TSharedPtr<FJsonValue> JsonItem : *list)
        {
            int num = JsonItem->AsNumber();
            UE_LOG(LogTemp, Warning, TEXT("arr num : %d"), num);
        }
    }
}

±¸Á¶Ã¼ Àбâ1

XXX.Build.cs ÆÄÀÏ¿¡ "JsonUtilities"¸¦ Ãß°¡ ÇÑ´Ù.

FJsonObjectConverterÀ» »ç¿ëÇÏ·Á¸é JsonObjectConverter.h¸¦ Æ÷ÇÔ ÇÑ´Ù.
#include "JsonObjectConverter.h"

void AUmgListViewDemoGameModeBase::TestJson2(const FString& FilePath)
{
    FString jsonstr;
    FFileHelper::LoadFileToString(jsonstr, *FilePath);

    TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
    TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

    if (FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid())
    {
        FStudent student;
        bool res = FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &student, 0, 0);
        UE_LOG(LogTemp, Warning, TEXT("student : %s, %d"), *student.name, student.age);
    }
}

Json ±¸Á¶¿Í ºñ½ÁÇÑ FStudent ±¸Á¶Ã¼¸¦ ¸¸µç´Ù.

USTRUCT(BlueprintType)
struct FStudent
{
    GENERATED_USTRUCT_BODY()
public:
    UPROPERTY()
    FString name;

    UPROPERTY()
    int    age;

    UPROPERTY()
    TArray<int> arr;
};

FJsonObjectConverter::JsonObjectToUStruct ÇÔ¼ö·Î ±¸Á¶Ã¼¸¦ Àд´Ù.
FStudent student;
bool res = FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &student, 0, 0);

¿ÀºêÁ§Æ® ¹è¿­ Àбâ

¹è¿­ÀÇ FJsonObject´Â AsObject·Î Àд´Ù.

for (TSharedPtr<FJsonValue> JsonItem : *list)
{
    TSharedPtr<FJsonObject> ChildObj = JsonItem->AsObject();
    ......
}

void AUmgListViewDemoGameModeBase::TestObjJson(const FString& FilePath)
{
    FString jsonstr;
    FFileHelper::LoadFileToString(jsonstr, *FilePath);

    TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
    TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

    if (FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid())
    {
        const TArray<TSharedPtr<FJsonValue>>* list;
        bool res = JsonObject->TryGetArrayField(TEXT("student"), list);
        for (TSharedPtr<FJsonValue> JsonItem : *list)
        {
            TSharedPtr<FJsonObject> ChildObj = JsonItem->AsObject();
            FString firstName = ChildObj->GetStringField(TEXT("firstName"));
            UE_LOG(LogTemp, Warning, TEXT("firstName : %s"), *firstName);
        }
    }
}

±¸Á¶Ã¼ Àбâ2

myobj_dirty.json ÆÄÀÏ
{
   "Class": 3,
  "student": [
    {
      "firstName": "chulsoo",
      "lastName": "kim",
      "gender": "man",
      "age":  3
    },
    {
      "firstName": "younghee"
    }
  ]
}

MyData.h ÆÄÀÏ¿¡¼­ FMember ±¸Á¶Ã¼
USTRUCT(BlueprintType)
struct FPeople
{
    GENERATED_USTRUCT_BODY()

public:
    UPROPERTY()
    FString firstName;

    UPROPERTY()
    FString lastName;

    UPROPERTY()
    FString gender;

    UPROPERTY()
    int age;
};

USTRUCT(BlueprintType)
struct FMember
{
    GENERATED_USTRUCT_BODY()
public:
    UPROPERTY()
    int Class;

    UPROPERTY()
    TArray<FPeople> student;
};

youngheeÀÇ µ¥ÀÌÅÍ´Â lastName, age ¼Ó¼ºÀÌ ºüÁ® À־
FJsonObjectConverter::JsonObjectToUStruct ÇÔ¼ö·Î ±¸Á¶Ã¼¸¦ Àдµ¥´Â ¹®Á¦°¡ ¾ø´Ù.

FMember member;
bool mres = FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &member, 0, 0);


void AUmgListViewDemoGameModeBase::TestObjJson1(const FString& FilePath)
{
    FString jsonstr;
    FFileHelper::LoadFileToString(jsonstr, *FilePath);

    TSharedRef<TJsonReader<TCHAR>> reader = TJsonReaderFactory<TCHAR>::Create(jsonstr);
    TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());

    if (FJsonSerializer::Deserialize(reader, JsonObject) && JsonObject.IsValid())
    {
        FMember member;
        bool mres = FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &member, 0, 0);

        UE_LOG(LogTemp, Warning, TEXT("resulting jsonString -> %s, %s, %d"), *member.student[0].firstName, *member.student[0].lastName, member.student[0].age);
        UE_LOG(LogTemp, Warning, TEXT("resulting jsonString -> %s, %s, %d"), *member.student[1].firstName, *member.student[1].lastName, member.student[1].age);
    }
}

´Ù¿î·Îµå:
mytest.json
myobj.json
myobj_dirty.json
MyData.h
UmgListViewDemoGameModeBase.cpp
BasicUITest_Json.zip

Âü°í)
TryGetArrayField
TSharedPtr<FJsonObject> Object = Value.AsObject();
https://ballbot.tistory.com/45

https://cpp.hotexamples.com/examples/-/FHttpResponsePtr/GetContentAsString/cpp-fhttpresponseptr-getcontentasstring-method-examples.html
https://www.fourat-djellouli.com/post/how-to-use-json-with-unreal