我想将二维数组反序列化为.net对象的集合。原因是,数组语法将使我的用户更容易在输入文件中使用。所以我只想将数组的索引映射到目标类型的特定属性。
EG具有:
[
["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);
问题内容: 我有一个带有JSON数组的有效JSON对象。JSON数组没有花括号,并且包含逗号分隔的混合类型列表。看起来像这样: 我创建了一个反映JSON结构的类,为复杂数组提供了一个List: 我也用列表列表进行了测试: 子模型如下所示: 在我的program.cs文件中,我正在反序列化如下: 当我运行该程序时,子对象(Rows)始终为。我究竟做错了什么? 问题答案: Json.Net没有将数组自
问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr
问题内容: 我有一个JSON数组,其中包含具有不同属性的不同类型的对象。属性之一称为“类型”,它确定数组项的类型。这是我的数据示例: 为了将这些对象映射到我的.Net实现中,我定义了一组类:一个基类和几个子类(具有复杂的层次结构,具有4个“世代”)。这只是这些类的一个小示例: 我想达到的目的是能够将此数组反序列化为协变通用列表,声明为: 此列表应包含从TExpression继承的适当子类的实例,因
问题内容: 我正在尝试将json数据反序列化为模型类,但是失败了。这是我的工作: 这是我的模型的样子: 您可以看到我到达这里的Json:http : //api.worldbank.org/incomeLevels/LIC/countries? format=json 这是我得到的错误: 无法将JSON数组反序列化为“ Mvc4AsyncSample.Models.CountryModel”类型。
如何将jackson JSON映射器与Java 8 LocalDateTime一起使用? JSONMappingException:无法从JSON字符串实例化类型[simple type,class java.time.LocalDateTime]的值;没有单字符串构造函数/工厂方法(通过引用链:mydto[“field1”]->subdto[“date”])
问题内容: 我有以下从外部方收到的JSON字符串。 我的映射类: 现在的问题是,我不喜欢的 类名 和 字段名 的类。相反,我希望它被命名,并且还希望从字段名称中删除并提供适当的名称。 我可以重命名为,但是如果我更改了字段名(在类中),它将无法正确地反序列化并提供给我。我该如何克服呢? 问题答案: Json.NET具有允许您指定JSON属性名称的名称,因此您的代码应为: 文档: 序列化属性