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

如何使用Json.Net将JSON数组反序列化为对象?

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

如何使用Json.Net将JSON数组反序列化为对象?

Json.Net没有将数组自动映射到类的功能。为此,您需要一个自定义

JsonConverter
。这是一个应该为您工作的通用转换器。它使用一个自定义
[JsonArrayIndex]
属性来标识类中的哪些属性与数组中的哪些索引相对应。如果JSON更改,这将使您轻松更新模型。另外,您可以安全地忽略类中不需要的属性,例如
Filler

这是代码:

public class JsonArrayIndexAttribute : Attribute{    public int Index { get; private set; }    public JsonArrayIndexAttribute(int index)    {        Index = index;    }}public class ArrayToObjectConverter<T> : JsonConverter where T : class, new(){    public override bool CanConvert(Type objectType)    {        return objectType == typeof(T);    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        JArray array = JArray.Load(reader);        var propsByIndex = typeof(T).GetProperties() .Where(p => p.CanRead && p.CanWrite && p.GetCustomAttribute<JsonArrayIndexAttribute>() != null) .ToDictionary(p => p.GetCustomAttribute<JsonArrayIndexAttribute>().Index);        JObject obj = new JObject(array .Select((jt, i) => {     PropertyInfo prop;     return propsByIndex.TryGetValue(i, out prop) ? new JProperty(prop.Name, jt) : null; }) .Where(jp => jp != null)        );        T target = new T();        serializer.Populate(obj.CreateReader(), target);        return target;    }    public override bool CanWrite    {        get { return false; }    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        throw new NotImplementedException();    }}

要使用转换器,您需要标记您的

ChildModel
班级,如下所示:

[JsonConverter(typeof(ArrayToObjectConverter<ChildModel>))]class ChildModel{    [JsonArrayIndex(0)]    public int ID { get; set; }    [JsonArrayIndex(1)]    public string StatusId { get; set; }    [JsonArrayIndex(2)]    public DateTime ContactDate { get; set; }    [JsonArrayIndex(3)]    public string State { get; set; }    [JsonArrayIndex(4)]    public string Status { get; set; }    [JsonArrayIndex(5)]    public string CustomerName { get; set; }    [JsonArrayIndex(6)]    public DateTime WorkStartDate { get; set; }    [JsonArrayIndex(7)]    public DateTime WorkEndDate { get; set; }    [JsonArrayIndex(8)]    public string Territory { get; set; }    [JsonArrayIndex(9)]    public string CustType { get; set; }    [JsonArrayIndex(10)]    public int JobOrder { get; set; }    [JsonArrayIndex(12)]    public string link { get; set; }}

然后,只需像往常一样反序列化,它就可以按照您的要求工作。这是一个演示:https :
//dotnetfiddle.net/n3oE3L

注意:我没有实现

WriteJson
,因此,如果您将模型序列化回JSON,它将不会序列化回数组格式。相反,它将使用默认的对象序列化。



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

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

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