2014-09-18 3 views
0

복잡한 것을 직렬화 해제하고 json이 잘 구성되지 않았 으면합니다. 내가 작성한 코드는 객체를 deserialize하지 않으며 MovieInfo 속성은 null입니다. 코드에서 예제 json을 찾을 수 있습니다. JObject.Parsedynamic 개체를 사용하지 않는 것이 좋습니다. 내가 여기서 무엇을 놓치고 있니?복잡한 Json 객체를 역 직렬화

using System.Collections.Generic; 
using Newtonsoft.Json; 

namespace ComplexJsonExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string jsonInText = @" 
      { 
       ""movies"" : [ 
        { 
         ""Harry Potter"" : [ 
          { ""rating"": ""great""}, 
          { ""rating"": ""horrible""} 
         ] 
        }, 
        { 
         ""Guardians of the galaxy"" : [ 
          { ""rating"": ""cool""}, 
          { ""rating"": ""awesome""} 
         ] 
        } 
       ] 
      } 
      "; 

      var movieList = JsonConvert.DeserializeObject<MovieList>(jsonInText); 
     } 
    } 

    public class MovieList 
    { 
     [JsonProperty("movies")] 
     public IList<Movie> Movies { get; set; } 
    } 

    public class Movie 
    { 
     IDictionary<string, IList<MovieRating>> MovieInfo { get; set; } 
    } 

    public class MovieRating 
    { 
     [JsonProperty("rating")] 
     public string Rating { get; set; } 
    } 
} 
+0

무엇이 누락 되었습니까? 잘 형성된 json! – Jamiec

+0

문제는 내가 json을 만든 사람이 아니라 이것이 주어진 것입니다. – boli

+0

이 질문/답변을 확인하시는 것이 좋습니다. http://stackoverflow.com/questions/9452901/cannot-deserialize-json-array-into-type-json-net/9453191#9453191 – Jamiec

답변

1

그것은 조금 추한,하지만 당신은 이런 식으로 작업을 수행 할 수 있습니다 :

class MovieList 
{ 
    [JsonProperty("movies")] 
    public Movie[] Movies { get; set; } 
} 

class Movie : Dictionary<string, MovieRating[]> 
{ 
} 

class MovieRating 
{ 
    [JsonProperty("rating")] 
    public string Rating { get; set; } 
} 

영화는 단 하나의 키 (제목)가있는 사전이지만 JSON 구조와 일치합니다. deserialization을 수행 한 후에는 항상 더 현명한 것으로 매핑 할 수 있습니다.

+0

내가 전에 해봤 던 것은' Movie 클래스의 Dictionary ''필드. 솔루션을 가져 주셔서 감사합니다. – boli

1

나는이 해킹의 조금 생각하지만, 작동, 당신이 필요로하는 형식으로 JSON 문자열을 역 직렬화 :

class MovieConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Movie); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    {    

     var movie = new Movie(){ 
      MovieInfo = new Dictionary<string,IList<MovieRating>>() 
     }; 

     while (reader.Read() && reader.Value != null) 
     {     
      var name = (string)reader.Value; 

      reader.Read(); 

      var ratings = ((JArray)serializer.Deserialize(reader)).Values<string>("rating"); 

      movie.MovieInfo.Add(name, ratings.Select(r => new MovieRating(){ Rating = r}).ToList()); 
     } 
     return movie; 
    } 

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

내가 원래 개체에 대한 두 가지 변경을해야 않았다, 나는 그것을 액세스 할 수 있고, 두 번째는 추가 할 수 있도록 먼저 나는 MovieInfo 대중의 접근을 만든 JsonConverterAttribute :

[JsonConverter(typeof(MovieConverter))] 
public class Movie 
{ 
    public IDictionary<string, IList<MovieRating>> MovieInfo { get; set; } 
}