2012-10-25 218 views
4

我正在編寫客戶端應用程序,它應該處理服務器響應。響應以JSON格式顯示。我決定使用Json.NET來反序列化它們。我無法簡化或修改這些響應(在服務器端)。此特定JSON響應的特殊困難是不同的對象類型在同一個數組中:散列和文件數組。所以,我想將這個數組直接反序列化爲強類型對象,而不是對象數組。我認爲應該可以用CustomCreationConverter來實現,但我無法想象如何。Json.NET:將嵌套數組反序列化爲強類型對象

JSON:

{ 
    "files": 
    [ 
     "hash string", 
     [ 
      ["first file name", 12], 
      ["second file name", 34] 
     ] 
    ] 
} 

對象結構,我想實現:

public class RootObject 
{ 
    [JsonProperty("files")] 
    public FilesContainer Container 
    { 
     get; 
     set; 
    } 
} 

public class FilesContainer 
{ 
    public string Hash 
    { 
     get; 
     set; 
    } 

    public File[] Files 
    { 
     get; 
     set; 
    } 
} 

[JsonConverter(typeof(FileJsonConverter))] 
public class File 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    public int Size 
    { 
     get; 
     set; 
    } 
} 

class FileJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     File obj = new File 
     { 
      Name = reader.ReadAsString(), 
      Size = reader.ReadAsInt32().GetValueOrDefault() 
     }; 

     reader.Read(); 

     return obj; 
    } 

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

回答

4

我終於想通了如何做到這一點。我需要在JsonConverter內部使用serializer.Deserialize。所以,這裏是一個工作的例子。

class Program 
{ 
    static string json = @"{ 
           ""files"": 
           [ 
            ""hash string"", 
            [ 
             [""first file name"", 12], 
             [""second file name"", 34] 
            ] 
           ] 
          }"; 

    static void Main(string[] args) 
    { 
     RootObject container = JsonConvert.DeserializeObject<RootObject>(json); 
    } 
} 

public class RootObject 
{ 
    [JsonProperty("files")] 
    public FilesContainer Container 
    { 
     get; 
     set; 
    } 
} 

[JsonConverter(typeof(FilesContainerJsonConverter))] 
public class FilesContainer 
{ 
    public string Hash 
    { 
     get; 
     set; 
    } 

    public File[] Files 
    { 
     get; 
     set; 
    } 
} 

public class FilesContainerJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     FilesContainer obj = new FilesContainer(); 
     obj.Hash = reader.ReadAsString(); 
     reader.Read(); // to StartArray 
     obj.Files = serializer.Deserialize<File[]>(reader); 
     reader.Read(); // to EndArray 

     return obj; 
    } 

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

[JsonConverter(typeof(FileJsonConverter))] 
public class File 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    public int Size 
    { 
     get; 
     set; 
    } 
} 

class FileJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     File obj = new File 
     { 
      Name = reader.ReadAsString(), 
      Size = reader.ReadAsInt32().GetValueOrDefault() 
     }; 

     reader.Read(); // to EndArray 

     return obj; 
    } 

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