栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用json.net反序列化没有类型信息的多态json类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用json.net反序列化没有类型信息的多态json类

通过创建

JsonConverter
用于处理对象实例化的自定义,您可以相当轻松地做到这一点。假设您的类定义如下:

public abstract class GalleryItem{    public string id { get; set; }    public string title { get; set; }    public string link { get; set; }    public bool is_album { get; set; }}public class GalleryImage : GalleryItem{    // ...}public class GalleryAlbum : GalleryItem{    public int images_count { get; set; }    public List<GalleryImage> images { get; set; }}

您将这样创建转换器:

public class GalleryItemConverter : JsonConverter{    public override bool CanConvert(Type objectType)    {        return typeof(GalleryItem).IsAssignableFrom(objectType);    }    public override object ReadJson(JsonReader reader,         Type objectType, object existingValue, JsonSerializer serializer)    {        JObject jo = JObject.Load(reader);        // Using a nullable bool here in case "is_album" is not present on an item        bool? isAlbum = (bool?)jo["is_album"];        GalleryItem item;        if (isAlbum.GetValueOrDefault())        { item = new GalleryAlbum();        }        else        { item = new GalleryImage();        }        serializer.Populate(jo.CreateReader(), item);        return item;    }    public override bool CanWrite    {        get { return false; }    }    public override void WriteJson(JsonWriter writer,         object value, JsonSerializer serializer)    {        throw new NotImplementedException();    }}

这是一个示例程序,显示了运行中的转换器:

class Program{    static void Main(string[] args)    {        string json = @"        [ {     ""id"": ""OUHDm"",     ""title"": ""My most recent drawing. Spent over 100 hours."",     ""link"": ""http://i.imgur.com/OUHDm.jpg"",     ""is_album"": false }, {     ""id"": ""lDRB2"",     ""title"": ""Imgur Office"",     ""link"": ""http://alanbox.imgur.com/a/lDRB2"",     ""is_album"": true,     ""images_count"": 3,     ""images"": [         {  ""id"": ""24nLu"",  ""link"": ""http://i.imgur.com/24nLu.jpg""         },         {  ""id"": ""Ziz25"",  ""link"": ""http://i.imgur.com/Ziz25.jpg""         },         {  ""id"": ""9tzW6"",  ""link"": ""http://i.imgur.com/9tzW6.jpg""         }     ] }        ]";        List<GalleryItem> items =  JsonConvert.DeserializeObject<List<GalleryItem>>(json,      new GalleryItemConverter());        foreach (GalleryItem item in items)        { Console.WriteLine("id: " + item.id); Console.WriteLine("title: " + item.title); Console.WriteLine("link: " + item.link); if (item.is_album) {     GalleryAlbum album = (GalleryAlbum)item;     Console.WriteLine("album images (" + album.images_count + "):");     foreach (GalleryImage image in album.images)     {         Console.WriteLine("    id: " + image.id);         Console.WriteLine("    link: " + image.link);     } } Console.WriteLine();        }    }}

这是上面程序的输出:

id: OUHDmtitle: My most recent drawing. Spent over 100 hours.link: http://i.imgur.com/OUHDm.jpgid: lDRB2title: Imgur Officelink: http://alanbox.imgur.com/a/lDRB2album images (3):    id: 24nLu    link: http://i.imgur.com/24nLu.jpg    id: Ziz25    link: http://i.imgur.com/Ziz25.jpg    id: 9tzW6    link: http://i.imgur.com/9tzW6.jpg

小提琴:https :
//dotnetfiddle.net/1kplME



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号