2017-11-08 8 views
0

를 사용하여 재귀 클래스 계층 구조를 직렬화 할 수 없습니다. 사용자 정의 JsonConverter를 사용하여 JSON 문자열에서 비 직렬화해야합니다. 문제는 각 특정 사례에 대한 코드가 있지만 규칙 속성을 관리하기 위해 재귀 적으로 실행할 수 없다는 것입니다. 각 요소도 조건이 될 수 있습니다. 내 코드는이 (ReadJson 방법) 다음과 같습니다내가이 같은 클래스 계층이 JSON.NET

var jo = JObject.Load(reader); 
Rule rule = null; 

if (jo["condition"] == null) 
{ 
    rule = new Rule(); 
    //fill the properties for rule 
} 
else 
{ 
    rule = new Condition(); 
    //I now want the converter to go through all the values in jo["rules"] and turn them into Rules or Conditions 
} 

이를 달성하는 가장 좋은 방법은 무엇입니까? 오브젝트가 상태로 발견 된 경우 나, 나머지 부분에 대한 JSON을 얻기 위해 노력 :

var rules = JsonConvert.DeserializeObject<Rule[]>(json, this); 

예외 :

var json = jo.GetValue("rule").ToString(); 

하지만이 같은 직렬화 할 수없는, 그것은 예외가 발생합니다 is : JsonReaderException : JsonReader에서 JObject를 읽는 중 오류가 발생했습니다. 현재 JsonReader 항목이 객체가 아닙니다 : StartArray. 경로 ', 1 줄, 위치 1

아이디어가 있으십니까?

+0

무엇 JSON이 생겼는? –

+0

물론 규칙 또는 조건의 배열과 같습니다. [{...}, { "condition": true, ...}] –

답변

1

아직 멀지 않은 곳입니다. JSON에서 condition 속성의 존재 여부에 따라 올바른 유형의 개체를 인스턴스화 한 후에 serializer.Populate 메서드를 사용하여 인스턴스를 채울 수 있습니다. 이것은 재귀를 자동으로 처리해야합니다. 새 JsonReader 인스턴스를 을 사용하여 만들 수있는 Populate에 전달해야합니다. 여기

는 컨버터가 어떻게 보일지입니다 :

public class RuleConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Rule).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jo = JObject.Load(reader); 
     Rule rule = null; 

     if (jo["condition"] == null) 
     { 
      rule = new Rule(); 
     } 
     else 
     { 
      rule = new Condition(); 
     } 

     serializer.Populate(jo.CreateReader(), rule); 
     return rule; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
다음

동작하는 예제입니다 : https://dotnetfiddle.net/SHctMo

+0

감사합니다. serializer.Populate를 호출 할 때 여전히 예외가 발생합니다. JsonReaderException : JsonReader에서 JObject를 읽는 동안 오류가 발생했습니다. 현재 JsonReader 항목이 객체가 아닙니다 : StartArray. 경로 '규칙', 줄 1, 위치 31 내 코드는 가지고있는 코드와 같습니다. –

+0

JSON은 내가 게시 한 예제와 같은 구조를 가지고 있습니까? 아니면 어떻게 든 달라질 수 있습니까? 문제가 무엇인지를 진단하는 일은 내가 현재하고있는 것을 볼 수 없기 때문에 어렵습니다. 문제를 보여주는 [mcve]를 만들 수 있습니까? (가장 쉬운 방법은 필자의 예제를 포크로 바꾸고 JSON을 변경하는 것입니다.) –

+0

지금 고맙습니다. 내 실수는, 보통 그렇듯이! :-) –