2017-01-19 7 views
1

Unity에서 JSON을 비 직렬화하려고합니다.C#/Unity의 사용자 정의 JSON de/serializer

JSON이 보이는 데이터 구조에서 (자바 코드를 사용하여) 연재 :

클래스 A가 클래스 B의 오브젝트의 배열을 포함 클래스 A, 물체의

어레이 및

클래스 B 클래스 C의 오브젝트의 배열을 포함하고,

클래스 C는 클래스 D의 0 또는 1 객체를 포함

클래스 D가 다형성을 사용하기 때문에 빌트인 Unity 디시리얼라이저 인 JsonUtility가 클래스 D를 제외하고이 데이터 구조의 비 직렬화에 잘 작동합니다. 보다 구체적으로 말하면, 클래스 D는 실제로 인터페이스이고, 역 직렬화되는 객체는 서브 클래스 D1 또는 서브 클래스 D2 중 하나이다.

클래스 D 및 클래스 D에 대해서만 사용자 지정 데시리아 화를 작성할 수있는 방법이 있습니까? 빌트인 라이브러리가 Class A에서 C까지 deserialize하는 것을 처리하게되어 기쁩니다.하지만 클래스 D를 deserialize하기 위해 특별한 작업을해야합니다.

Java에서 이것은 호출 된 사용자 정의 디시리얼라이저를 등록 할 수 있었기 때문에 간단했습니다. 클래스 D의 객체가 직렬화 될 때마다. 그 디시리얼라이저 내에서 우리는 어떤 유형의 서브 클래스 (예 : D1 또는 D2입니까?)를보고 적절한 방식으로 비 직렬화를 수행 할 수 있도록 약간의 내부 검사를 수행 할 수있었습니다.

Unity (또는 C#)에서이 작업을 수행하는 방법을 잘 모르겠습니다.

MiniJSON, LitJSON, SimpleJSON 및 NewtonSoft의 JSON.NET을 살펴 봤지만 클래스에 대한 사용자 지정 디시리얼라이저를 작성할 수있는 항목을 찾지 못했습니다.

내가 찾은 가장 가까운 JSON.NET의 CustomCreationConvertor입니다 :

당신은 당신이에 역 직렬화 할 클래스에 대한 생성자를 호출 할 수 있습니다 http://www.newtonsoft.com/json/help/html/CustomCreationConverter.htm

(및 내장 디시리얼라이저 않는 나머지) 하지만 어떤 하위 클래스를 구성할지 결정하기 위해 어디에서 내성 검사를 할 수 있는지 잘 모르겠습니다.

의견을 보내 주셔서 감사합니다. How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

그 스레드가 어떻게 클래스 D.에 대한 디시리얼라이저를 작성하는 나를 보여줍니다하지만 문제는 여전히 남아있다 : ​​코멘트에서 Abion47이 게시 :

업데이트는 어떻게 사용자 정의 디시리얼라이저를 호출합니까? 주어진 예에서, 사용자 정의 디시리얼라이저는 다음과 같이 호출됩니다.

D sampleD = JsonConvert.DeserializeObject<D>(json, new CustomDConverter()); 

사용자 정의 디시리얼라이저가 전달된다 그러나 나는 또한 내장 된 클래스 C에 대한 디시리얼라이저 내에서 사용하고자하고 있다면이 작업을 수행 할 수있는 방법 어떤 D 클래스가 중첩되어 있습니까?

클래스 D의 객체를 만날 때마다 CustomDConverter를 사용하도록 JSON.NET에 알리는 방법이 있습니까? (그렇지 않으면 정상적으로 진행하십시오)?

+2

가능한 복제 [? 기본 클래스 개체의 목록을 역 직렬화하는 JSON.NET에서 사용자 정의 JsonConverter을 구현하는 방법] (http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base) – Abion47

+0

감사. 나는 스레드가 내 질문에 답할 수도 있다고 생각하지만, 확실히 알고 싶으면 독서와 소화를해야한다. – skrilmps

+0

Abion47 링크는 클래스 D에 대한 사용자 정의 디시리얼라이저를 작성하는 방법에 대한 내 문제를 해결할 것이라고 생각합니다. 그러나 클래스 D는 클래스 C에 중첩되어 있으므로 사용자 정의 디시리얼라이저는 어떻게 사용합니까? Class D에 대한 직 병렬 변환기를 수동으로 호출 할 수 있도록 클래스 C에 대한 사용자 지정 데시리아 화기를 작성해야합니까? – skrilmps

답변

0

내 질문에 대한 해결책을 찾았습니다.

사용자 지정 serializer를 작성하는 여기에 지침을 사용 : How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

당신의 시리얼이 (가 ... JsonConverter을 exted 위의 링크를 참조한다) CustomConverter라고 가정하자.

은 변환기에이 시리얼을 추가 한 후 호출 역 직렬화 <>() 정상적으로 :

JsonSerializer serializer = new JsonSerializer(); 
serializer.Converters.Add(new CustomConverter()); 

YourClass deserializedObject = serializer.Deserialize<YourClass>(jsonReader);