본문 바로가기

새싹 UE5

UE5 JsonObject 와 JsonUtilities 를 이용한 파싱

Json 형태의 파일을 언리얼에서 사용하기 위해 파싱 하는 방법

일단 Json 파일 자체를 가져오는건 다음에 하고 지금은 가상 데이터를 JsonObject 형태로 받고 다시 FString 에 넣겠다.

 

사전 작업으로 모듈 추가

 

DataToJson 의 예제 4가지

  1. 멤버를 하나씩 셋팅한다.
  2. FJsonObjectConverter 를 사용해서 한 번에 처리한다.
  3. 여러개의 데이터를 하나씩 셋팅한다.
  4. FJsonObjectConverter 를 사용해서 여러 데이터를 처리한다.

 

1. 멤버를 하나씩 셋팅

특징 : 원하는 멤버만 셋팅하고 싶다면 이 방식을 사용하면 좋다.

 

먼저 원하는 데이터를 구조체로 레이아웃 설정을 해준다.

 

구조체에 가상의 데이터를 생성한다.

 

이제 JsonObejct 를 생성하고 데이터를 JObj 에 셋팅한다.

이때, Array 계열의 멤버는 따로 FJsonValue 에 하나씩 담아서 ArrayField 에 추가한다.

 

넣고 나면 마지막으로 JssonWriterFactory 를 이용해 JsonWriter 를 생성한다.다음 FString 에 직렬화 작업을 해주기 위해 JsonObject 를 Writer와 연결하여 FString 변수에 JsonObject 의 데이터를 쓴다. 그 역할이 Writer 이다.

 

결과 Json 형식으로 FString 이 찍힘

 

2. FJsonObjectConverter 를 이용

Json 과 형식을 맞춰서 사용하면 컨버터를 이용하는 것도 좋다.

이 말은 반대로 형식을 맞춰야하기 때문에 안넣어도 되는 더미 데이터가 넘겨질수 있다는 것이다.

 

 

JsonConverter 를 쓸려면 USTRUCT 형식의 언리얼 구조체여야한다. 멤버에도 UPROPERTY 를 붙여주는게 좋다.

 

컨버터를 사용해서 한 번에 JsonString 형식으로 만들어 FString에 할당 가능하다.

 

결과 >> 더 간편하게 사용 가능하지만 형식을 맞춰줘야 한다는 것이 특징이다.

 

3. 여러 데이터를 하나씩 셋팅

위와 같은 가상 데이터가 하나가 아니라 여러개 일 때에는 어떻게 셋팅할까?

그냥 일반적으로 for 문을 돌린다음에 넣을 수 가 없다. 

FJsonObject 로 만든 객체들을 배열에 다시 넣어 직렬화해주어야한다.

 

for 문을 이용해서 여러 가상 데이터를 만들고 배열에 넣어준다.

 

이제 추가로 배열을 하나 더 만드는데 이 배열의 역할은 FJsonValue 를 저장하는 역할이다. FJsonValue 는 밑에서 JsonObject 를 가지게 될 것.

 

순서를 쉽게 보면 FJsonObject 생성 >> FJsonValue 로 멤버 내에 배열을 Value 로 만들고 각각 다시 ValueArray 에 넣고 JsonObject 에 셋팅 >> JsonObject 를 이용해서 FJsonValueObject 객체 만들기 >> 최종 Value 배열에 추가하기

 

이제 저 배열 형식의 JsonObject 들을 가지고 있는 JsonValue 배열을 직렬화 시켜준다.

 

결과 Json 형식으로 많은 데이터를 한 번에 FString 에 직렬화 하였다.

 

4. 컨버터를 이용한 여러 가상 데이터를 셋팅

3번 방식에서 컨버터를 사용하는 것 외에 차이가 없다. 다만, 컨버터를 사용한다면 주의 할 점이 있는데

구조체를 담은 배열을 넘기는 것이 불가능하다.

그래서 구조체로 구조체를 감싸는 형식을 사용한다.

 

이는

위와 같다.

 

이렇게 2개의 구조체를 활용한다.

 

결과

 

 

 

 

 

 

 

 

 

마지막으로 Json 형식의 FString 을 다시 Data 에 넣는다.

 

 

1번 방식 : 여기서는 FJsonObjectConverter 를 이용해 Json 형식의 FString 변수로 JsonObject 를 만들고 그 내용을 구조체에 넣는다.

 

2번 방식 : TJsonReader 를 사용해 Json 형식의 FString 을 읽을 수 있는 리더를 만들고
JSonObject 변수에 데이터를 역직렬화하여 넣어준다.
다음 JsonObject 에 대입 된 데이터들을 TEXT 로 각각 Get 해서 구조체의 멤버에 할당한다.

 

결과로 구조체 변수에 JsonObject 의 내용이 들어갔다.