【发布时间】:2017-05-17 21:01:34
【问题描述】:
我有以下 JSON(我无法更改传入的 JSON,因为它来自第 3 方系统):
{
"id": 23,
"userName":"test@test.com",
"tags":
{
"Employee ID":
{
"name":"Employee ID",
"value":"123456789"
},
"Job Family":
{
"name": "Job Family",
"value": "Accounting and Finance"
}
}
}
首先,我尝试使用这个类结构进行反序列化:
public class User
{
[JsonProperty("id")]
public int ID { get; set; }
[JsonProperty("username")]
public string Email { get; set; }
[JsonProperty("tags")]
public TagsJson Tags { get; set; }
}
public class TagsJson
{
[JsonProperty("tags")]
public List<Tag> Tags { get; set; }
}
public class Tag
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
}
在使用 Newtonsoft 的 JsonConvert.DeserializeObject(json); 时,User.Tags 属性始终为空。这显然是因为“Tags”属性下没有“Tags”。
但是,如果我按如下方式更改 User 类...
public class User
{
[JsonProperty("id")]
public int ID { get; set; }
[JsonProperty("email")]
public string Email { get; set; }
[JsonProperty("tags")]
public List<Tag> Tags { get; set; }
// I even tried Tag[] instead of List<Tag> here
}
...我收到以下错误:
附加信息:无法反序列化当前 JSON 对象 (例如 {"name":"value"}) 转换为类型 'System.Collections.Generic.List`1[Tag]' 因为类型需要 正确反序列化的 JSON 数组(例如 [1,2,3])。
任何关于创建 User 类以使其正确反序列化的建议将不胜感激。
编辑
所以这可能是也可能不是最好的答案,但它确实有效。进来的标签将是十几个不同名称中的一个。因此,我为 12 种可能性中的每一种创建了一个带有属性的标签类。由于没有一个是必需的,因此出现的任何一个都会被填充。下面是我调整后的 User、Tags(以前的 TagsJson)和 Tag 类 - 但我肯定对更好的解决方案感兴趣。
public class User
{
[JsonProperty("id")]
public int ID { get; set; }
[JsonProperty("username")]
public string Email { get; set; }
[JsonProperty("tags")]
public Tags AllTags { get; set; }
}
public class Tags
{
[JsonProperty("Employee ID")]
public Tag EmployeeID { get; set; }
[JsonProperty("Job Family")]
public Tag JobFamily { get; set; }
// ... and 10 more properties for additional tags that may appear but are not required
}
public class Tag
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
}
this question 的建议答案在我的情况下不起作用,因为 JSON 不是数组或集合,而是具有名称/值对的唯一属性名称列表。
【问题讨论】:
-
示例中的标签是单个对象。如果它是一个数组,它会被包裹在
[] -
@Zinov 这两个问题都是关于 json 反序列化的,这个问题的答案非常简单,并且在 stackoverflow 上已经有足够的信息来解决它。但是,此问题专门针对反序列化特定架构,该架构与您链接的问题中的数据架构不同。
标签: c# .net json serialization