Json.NET: deserialize nested arrays into strongly typed object
I finally figured out how to do this. I was needed to use serializer.Deserialize
inside of JsonConverter
. So, here is a working example.
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(); }}