反序列化JSON不能使用JSON.NET
使用JSON.NET进行反序列化时,我遇到以下JSON问题。
{ "?xml": { "@version": "1.0", "@encoding": "utf-8" }, "Persons": { "Person": [{ "@Id": "1", "@Name": "John", "@Surname": "Smith" }, { "@Id": "2", "@Name": "John", "@Surname": "Smith", "Skills": { "Skill": [{ "@Id": "1", "@Name": "Developer" }, { "@Id": "2", "@Name": "Tester" }] } }] } }
我正在使用以下课程:
public class RootObject { public Xml xml { get; set; } public Persons Persons { get; set; } } public class Xml { public string version { get; set; } public string encoding { get; set; } } public class Persons { public List Person { get; set; } } public class Skill { public int Id { get; set; } public string Name { get; set; } } public class Skills { public List Skill { get; set; } } public class Person { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public Skills Skills { get; set; } }
当我尝试反序列化时
RootObject persons = JsonConvert.DeserializeObject(json);
我收到以下错误:
无法将当前JSON对象(例如{“name”:“value”})反序列化为类型’System.Collections.Generic.List`1 [Project.Models.Persons.Skill]’,因为该类型需要JSON数组(例如[ 1,2,3])正确反序列化。 要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是类似的集合类型可以从JSON对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。
我想问题在于符号:
"Skills": { "Skill": [{
我错过了什么,这个问题有一个简单的解决方案吗?
更新:
所以最后问题是它有时候是一个JSON数组
"Skills": { "Skill": [{
有时候是一个JSON对象
"Skills": { "Skill": {
但是当我将代码粘贴/检查到validation器时,它总是被格式化为JSON数组,因此我使用监视窗口检查它以查看原始json字符串。
从那里可以很容易地用JsonConverter属性标记属性
public class Skills { [JsonConverter(typeof(MyConverter))] public List Skill { get; set; } }
并写入转换器:
public class MyConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) { return serializer.Deserialize<List>(reader); } else { Skill skill = serializer.Deserialize(reader); return new List(new[] { skill}); } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(value); } }
希望它对某人有帮助。
我认为,使用您当前的JSON,您将描述Skill
包含集合,而不是Skills
。 请尝试使用此JSON:
"Skills": [ { "@Id": "1", "@Name": "Developer" }, { "@Id": "2", "@Name": "Tester" } ]
同样的事情适用于您如何定义Persons
集合。
编辑:
这个测试通过我:
[TestFixture] public class JSONTester { [Test] public void Json_deserialize() { var json = @"{ ""?xml"": { ""@version"": ""1.0"", ""@encoding"": ""utf-8"" }, ""Persons"": { ""Person"": [{ ""@Id"": ""1"", ""@Name"": ""John"", ""@Surname"": ""Smith"" }, { ""@Id"": ""2"", ""@Name"": ""John"", ""@Surname"": ""Smith"", ""Skills"": { ""Skill"": [{ ""@Id"": ""1"", ""@Name"": ""Developer"" }, { ""@Id"": ""2"", ""@Name"": ""Tester"" }] } }] } }"; var persons = JsonConvert.DeserializeObject(json); Assert.AreEqual(persons.Persons.Person[1].Skills.Skill.Count, 2); } public class RootObject { public Xml xml { get; set; } public Persons Persons { get; set; } } public class Xml { public string version { get; set; } public string encoding { get; set; } } public class Persons { public List Person { get; set; } } public class Skill { public int Id { get; set; } public string Name { get; set; } } public class Skills { public List Skill { get; set; } } public class Person { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public Skills Skills { get; set; } } }