JSON反序列化 – 使用JSON.NET将数组索引映射到属性

我想将二维数组反序列化为.net对象的集合。 原因是,我的用户可以更容易地在输入文件中使用数组语法。 所以我只想将数组的索引映射到我的目标类型的特定属性。

EG用:

[ ["John", "Smith", "23"], ["Paula", "Martin", "54] ] 

我会得到一个人的两个实例:

 public class Person { public string First {get;set;} public string Last {get;set;} public string Age {get;set;} } 

其中内部数组的索引0映射到First ,索引1映射到Last ,索引2映射到Age ;

有没有办法扩展Json.NET,以便我可以在反序列化期间进行映射,以便隐藏实现细节? 我一直在玩一个自定义的JsonConverter但我没有找到关于如何使用它的更多信息。

编辑:具体来说,我不确定JsonConverter是否正确使用,我无法弄清楚如何实现CanConvert以及如何使用传递给ReadJson方法的参数。

您可以使用JsonConverter执行此JsonConverter 。 用于此目的的简单转换器将是:

 public class PersonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(Person); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var array = JArray.Load(reader); var person = (existingValue as Person ?? new Person()); person.First = (string)array.ElementAtOrDefault(0); person.Last = (string)array.ElementAtOrDefault(1); person.Age = (string)array.ElementAtOrDefault(2); return person; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var person = (Person)value; serializer.Serialize(writer, new[] { person.First, person.Last, person.Age }); } } 

然后你可以将它应用到你的class级:

 [JsonConverter(typeof(PersonConverter))] public class Person { public string First { get; set; } public string Last { get; set; } public string Age { get; set; } } 

或者在设置中使用它:

 var settings = new JsonSerializerSettings { Converters = new [] { new PersonConverter() } }; var list = JsonConvert.DeserializeObject>(json, settings); 
  public override bool CanConvert(Type objectType) { if (objectType == typeof(List)) return true; return false; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { List persons = new List(); JArray personsArray = (JArray)serializer.Deserialize(reader); foreach (var personArray in personsArray.Children()) { persons.Add(new Person() { First = personArray[0].Value(), Last = personArray[1].Value(), Age = personArray[2].Value() }); } return persons; }