본문 바로가기

볼봇의 코딩 생활/언리얼한 엔진

[UE4] JSON 데이터 파싱 하기

 

게임은 데이터 덩어리이다.

데이터를 다루는데 규격은 필수이다. 그 중 JSON 은 굉장히 유용하게 쓰인다.

 

언리얼 엔진에서 JSON 문자열을 다루는 기능을 제공한다.

(블루프린트 사용 안됨, C++ 만 가능)

 

이 기능을 사용하여 JSON 스트링을 파싱해보자.

 

준비하기

먼저 [ProjectName].build.cs 파일의 의존성 배열에 "Json" 을 추가한다.

빌드할때 Json 관련 라이브러리를 추가하게 된다.

 

 

JSON 문자열 읽어오기

JSON 스트링을 읽어오려면 TJsonReader 가 필요하다.

TSharedRef<TJsonReader<TCHAR>> Reader = TJsonReaderFactory<TCHAR>::Create("JSON STRING");

"JSON STRING" 부분에 알맞는 JSON 문자열을 적어야 한다. 그대로 실행하면 오류난다.

 

Reader 를 만들었다면, 파싱한 데이터가 저장될 FJsonObject 가 필요하다.

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

공유포인터 형태로 객체를 감쌌다.

마지막으로 역직렬화 하여 JSON 문자열을 FJsonObject 형태로 바꾼다.

FJsonSerializer::Deserialize(Reader, JsonObject)

 

역직렬화를 마치면 JsonObject 변수를 통해 데이터를 읽어 올 수 있다.

 

데이터 읽기

json 에서 객체, 배열, 숫자, 문자열을 표현 할 수 있다.

안전한 방법과, 안전하지 않은 방법 두가지로 예제를 구성해보았다.

 

필드가 없는 경우 오류가 발생하기 때문에, 번거롭더라도 안전한 방법을 사용하는게 좋은 프로그램을 만드는

첫 걸음이 아닐까 싶다.

 

Object 읽기

TSharedPtr<FJsonObject> Object = JsonObject->GetObjectField(TEXT("FieldName"));

또는

const TSharedPtr<FJsonObject>* JsonObject;
if(JsonObject->TryGetObjectField(TEXT("FieldName"), JsonObject)) {
	// When Parsing Success.
} else {
	// When Parsing Failed.
}

 

Number 읽기

int32 Value = JsonObject->GetIntegerField(TEXT("FieldName"));

또는

double Value;
if(JsonObject->TryGetNumberField(TEXT("FieldName"), Value)) {
	// When Parsing Success.
} else {
	// When Parsing Failed.
}

 

String 읽기

FString Value = JsonObject->GetStringField(TEXT("FieldName"));

또는

FString Value;
if(JsonObject->TryGetStringField(TEXT("FieldName"), Value)) {
	// When Parsing Success.
} else {
	// When Parsing Failed.
}

 

Array 읽기

TArray<TSharedPtr<FJsonValue>> Array = JsonObject->GetArrayField(TEXT("FieldName"));

또는

const TArray<TSharedPtr<FJsonValue>>* Value;
if(JsonObject->TryGetArrayField(TEXT("FieldName"), Value)) {
	// When Parsing Success.
} else {
	// When Parsing Failed.
}

 

Json 파싱에 대한 레퍼런스는 아래 링크를 참고하면 도움이 된다.

FJsonObject | Unreal Engine Documentation

 

FJsonObject

A Json Object is a structure holding an unordered set of name/value pairs.

docs.unrealengine.com

 

FJsonValue 의 경우?

Json 값이지만, 아직 타입이 지정되지 않은 경우 이 값을 반환한다.

 

예를 들어, Array 를 파싱하는 경우 FJsonValue 로 구성된 값들을 반환하는데

json 특성상 배열에는 문자, 숫자, 객체가 막무가내로 들어갈 수 있어서 그렇다.

 

FJsonValue 를 만나는 경우 타입을 지정시켜 값을 파싱해야 한다.

 

FJsonValue to String

FString Value = Value.AsString();

 

FJsonValue to Number

double Value = Value.AsNumber();

 

FJsonValue to Object

TSharedPtr<FJsonObject> Object = Value.AsObject();

 

FJsonValue to Array

TArray<TSharedPtr<FJsonValue>> Array = Value.AsArray();

 

FJsonValue 에 대한 자세한 레퍼런스 정보는 아래 링크를 참고하자.

FJsonValue | Unreal Engine Documentation

 

FJsonValue

A Json Value is a structure that can be any of the Json Types.

docs.unrealengine.com

 

이정도만 알고있으면 언리얼 엔진에서 JSON 문자열을 파싱하는데 어려움은 없을것이다.