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,它将不会序列化回数组格式。相反,它将使用默认的对象序列化。



