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; }