gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:38:58 25 4
gpt4 key购买 nike

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

例如与:

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

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

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 来做到这一点.一个用于此目的的简单转换器是:

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

如果特定属性有非原始类型,可以使用 JToken.ToObject<T>(JsonSerializer) 将它们反序列化为所需的类型:

person.First = array.ElementAtOrDefault(0)?.ToObject<string>(serializer);

然后你可以将它应用到你的类中:

[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<List<Person>>(json, settings);

关于c# - JSON 反序列化 - 使用 JSON.NET 将数组索引映射到属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com