2013-10-31 1 views
2

매우 간단하지만 나는 그 방법을 알아낼 수 없습니다.JSON 문자열을 deserialize하는 동안 배열 항목을 무시하는 방법

:

{"data":["Monday 13 january", {"id":"1234aa","name":"teamA"},{"id":"1234bb","name":"teamB"}, "Tuesday 14 january", {"id":"1234aa","name":"teamA"}]} 

이 같은 객체가 발생합니다 : 내가 JSON 결과를 (Newtonsoft.JSON 사용) 문제는이 같은 혼합 종류와 배열 나 잎 가난한 디자인 얻기 위해 외부 API를 사용하여 입력 된 배열 어떤 생각이 행동의이 종류를 달성하는 방법은

public class RootObject 
{ 
    public List<Team> data { get; set; } 
} 

내가 그 날짜 문자열을 무시하고 객체를 직렬화하는

public class RootObject 
{ 
    public List<object> data { get; set; } 
} 
?

업데이트 : 어쩌면 그것에 대해 명확하지 않았지만 deserialization 후에 soms 변환을 수행하지 않는 솔루션을 찾고 있습니다. JsonConverter 같은 일부 통합 솔루션이 필요합니다.

답변

1

사용자 정의 JsonConverter과 함께 할 수 있습니다.

당신이 당신의 클래스를 다음과 같이 설정했다고 가정 :

public class RootObject 
{ 
    [JsonProperty("data")] 
    [JsonConverter(typeof(TeamListConverter))] 
    public List<Team> Teams { get; set; } 
} 

public class Team 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

그런 다음 당신은 JSON 배열의 직렬화를 처리하기 위해이 JsonConverter를 사용할 수 있습니다. 이렇게하면 배열의 모든 일반 문자열 (날짜)이 무시되고 객체를 deserialize하려고 시도합니다. 여기

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JArray array = JArray.Load(reader); 
     List<Team> teams = new List<Team>(); 
     foreach (JToken token in array.Children()) 
     { 
      if (token.Type == JTokenType.Object) 
      { 
       teams.Add(token.ToObject<Team>()); 
      } 
     } 
     return teams; 
    } 

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

데모 프로그램입니다 :

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""data"": 
      [ 
       ""Monday 13 january"", 
       { 
        ""id"":""1234aa"", 
        ""name"":""teamA"" 
       }, 
       { 
        ""id"":""1234bb"", 
        ""name"":""teamB"" 
       }, 
       ""Tuesday 14 january"", 
       { 
        ""id"":""1234aa"", 
        ""name"":""teamA"" 
       } 
      ] 
     }"; 

     RootObject obj = JsonConvert.DeserializeObject<RootObject>(json); 

     foreach (Team t in obj.Teams) 
     { 
      Console.WriteLine(t.Id + " - " + t.Name); 
     } 
    } 
} 

그리고 여기에 출력됩니다 :

1234aa - teamA 
1234bb - teamB 
1234aa - teamA 

당신이 찾고있는 무슨이인가?

+0

그게 바로 내가 뭘 찾고있어, 고마워! 나는 어제 그 같은 것을 알았는데 evenening,하지만 2 변환기를 사용합니다. 네가 더 잘 보이고 깨끗해. 오늘 밤에 한 발 맞춰보고 작동하면 표시해 둡니다. 감사! –

+0

매력처럼 작동합니다, 감사합니다! –

0

시간에 개체를 serialize 할 때 무시할 속성을 구성 할 수 있으면이를 수행 할 수 있습니다. 그런 식으로 수행했다면 목록 List<Object> data을 반복하여 Team 개체를 찾아서 별도의 목록에 넣어야합니다.

+0

나는 따르지 않는다. 나의 질문은 속성에 관한 것이 아니라 배열 항목을 무시하는 것에 관한 것이다. 솔루션이 도움이되는지 확인하려면 몇 가지 샘플 코드를 추가하십시오. –

관련 문제