2017-12-20 16 views
1

이상한 직렬화 패턴이있는 API를 쿼리합니다. 일부의 프로퍼티는 null (존재하지 않는다) 또는 객체의 배열 (디폴트) 또는 단지 객체 일 수도 있습니다. 목록에있는 항목 수에 따라 다릅니다. json.net에서 사용자 지정 속성의 비 직렬화

{ 
    persons: [{ name: "lastname1, firstname1" }, { name: "lastname2, firstname2" }] 
} 

{ 
    persons: null 
} 

또는

{ 
    persons: { name: "lastname1, firstname1" } 
} 

또는

지금 나는이 사용 json.net를 직렬화하는. 하지만 내 모델을 정의하는 법을 모르겠습니다. person 속성을 List로 정의 할 때 <Person> case 1과 3은 비 직렬화를 deserialize하지만 case 2는 실패합니다. Person으로 정의하면 케이스 1과 2가 잘 디 SERIAL됩니다. 가장 좋은 점은 사람들의 목록으로 정의하고 json.net이 올바르게 역 직렬화하도록 지시하는 내용을 쓸 수있을 때입니다. 이제 json.net에는 직렬화 및 비 직렬화를 가로 채기위한 몇 가지 개념이 있습니다. 가장 좋은 방법은 무엇입니까?

+0

감사 - 네, 그것은 언급 한 바와 같은 문제를 정확히 - 나는 –

+0

걱정을 검색하지 않을 때 난 그냥이 질문을 찾을 수 없습니다가; 그것은 항상 발생합니다. –

답변

0

사용자 정의 변환기 구현 이외의 옵션은 없습니다.

class CollectionConverter<T> : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(List<T>)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 
     if (token.Type == JTokenType.Array) 
     { 
      return token.ToObject<List<T>>(); 
     } 
     return new List<T> { token.ToObject<T>() }; 
    } 

    public override bool CanWrite => false; 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("There is no writing implemantation"); 
    } 
} 

public class PersonList 
{ 
    [JsonConverter(typeof(CollectionConverter<Person>))] 
    public List<Person> Persons { get; set; } 
} 

컬렉션으로 개체를 deserialize;

var str = "{ persons: { name: \"lastname1, firstname1\" } }"; 
var obj = JsonConvert.DeserializeObject<PersonList>(str); 

직렬화 컬렉션; 지적 @ 브라이언

var str = "{ persons: [{ name: \"lastname1, firstname1\" },{ name: \"lastname1, firstname1\" }] }"; 
var obj = JsonConvert.DeserializeObject<PersonList>(str); 
+0

솔루션을 제공해 주셔서 감사합니다. 정확히 내가 찾고 있던 것이 었습니다. 브라이언은 맞습니다. 동일한 해결책을 지적한 기존 질문과 중복됩니다. –

0

처음에는 사람이 null (== null)인지 확인할 수 있습니다. 당신이 json.net를 사용하는 경우 다음

, 사람들은 그것이는 jarray 다음 그냥 객체 가정이 아닌 경우

if(personsJsonParsed is JArray) 

를 사용하여 배열 인 경우
당신은 확인할 수 있습니다.