Json.NET:将嵌套数组反序列化为强类型对象
发布时间:2020-12-16 18:40:50 所属栏目:百科 来源:网络整理
导读:我正在编写客户端应用程序,它应该处理服务器响应.回复是 JSON.我决定使用Json.NET来反序列化它们.我无法简化或修改这些响应(在服务器端).这种特定JSON响应的特殊困难是不同的对象类型在同一个数组中:散列和文件数组.所以,我想直接将这个数组反序列化为强类
我正在编写客户端应用程序,它应该处理服务器响应.回复是
JSON.我决定使用Json.NET来反序列化它们.我无法简化或修改这些响应(在服务器端).这种特定JSON响应的特殊困难是不同的对象类型在同一个数组中:散列和文件数组.所以,我想直接将这个数组反序列化为强类型对象,而不是对象数组.我认为应该可以使用CustomCreationConverter实现,但我无法想象如何.
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(); } } 解决方法
我终于想出了如何做到这一点.我需要在JsonConverter中使用serializer.Deserialize.所以,这是一个有效的例子.
class Program { static string json = @"{ ""files"": [ ""hash string"",[ [""first file name"",[""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,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,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,Size = reader.ReadAsInt32().GetValueOrDefault() }; reader.Read(); // to EndArray return obj; } public override void WriteJson(JsonWriter writer,JsonSerializer serializer) { throw new NotImplementedException(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |