C# 如何将json反序列化到对象集合中
我有以下JSON(我无法更改传入的JSON,因为它来自第三方系统): 首先,我尝试使用以下类结构进行反序列化:C# 如何将json反序列化到对象集合中,c#,.net,json,serialization,C#,.net,Json,Serialization,我有以下JSON(我无法更改传入的JSON,因为它来自第三方系统): 首先,我尝试使用以下类结构进行反序列化: public class User { [JsonProperty("id")] public int ID { get; set; } [JsonProperty("username")] public string Email { get; set; } [JsonProperty("tags")] public TagsJson
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; }
}
…我得到以下错误:
其他信息:无法反序列化当前JSON对象
(例如,{“名称”:“值”})转换为类型
'System.Collections.Generic.List'1[Tag]”,因为该类型需要
用于正确反序列化的JSON数组(例如[1,2,3])
任何关于创建用户类以允许其正确反序列化的建议都将不胜感激
编辑 因此,这可能是最好的答案,也可能不是,但它是有效的。这些标签将是十几个不同名称中的一个。所以我创建了一个Tags类,它为12个可能性中的每一个都有一个属性。因为不需要,所以任何出现的都将被填充。下面是我调整后的用户、标签(以前是TagsJson)和标签类——但我肯定对更好的解决方案感兴趣
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; }
}
建议的答案在我的情况下不起作用,因为JSON不是数组或集合,而是一个具有名称/值配对的唯一属性名列表。不确定您的JSON是否正确,但为什么您的属性名
员工ID
或工作族
中有空格。在课堂上修复这些标签,我们就可以开始了
public class EmployeeID
{
public string name { get; set; }
public string value { get; set; }
}
public class JobFamily
{
public string name { get; set; }
public string value { get; set; }
}
public class Tags
{
public EmployeeID __invalid_name__Employee ID { get; set; }
public JobFamily __invalid_name__Job Family { get; set; }
}
public class User
{
public int id { get; set; }
public string userName { get; set; }
public Tags tags { get; set; }
}
这是我从中得到的,您的JSON显示您的
标记
对象是一个对象
——而不是数组
。无法将对象
反序列化为C#列表
,因为它们是不同的结构
如果标签
中的键是动态的/变化的,那么不妨尝试一下
[JsonProperty("tags")]
Dictionary<string, string> Tags { get; set; }
[JsonProperty(“标记”)]
字典标记{get;set;}
编辑
看来您的JSON格式不正确;如果您无法修改它,您可能必须使用自定义的
public class Rootobject
{
public int id { get; set; }
public string userName { get; set; }
public Tags tags { get; set; }
}
public class Tags
{
[JsonProperty(PropertyName = "Employee ID")]
public EmployeeID EmployeeID { get; set; }
[JsonProperty(PropertyName = "Job Family")]
public JobFamily JobFamily { get; set; }
}
public class EmployeeID
{
public string name { get; set; }
public string value { get; set; }
}
public class JobFamily
{
public string name { get; set; }
public string value { get; set; }
}
我必须自己添加JsonProperty属性。但是我认为更好的解决办法是
public class Rootobject2
{
public int id { get; set; }
public string userName { get; set; }
public IDictionary<string, NameValuePair> tags { get; set; }
}
public class NameValuePair
{
public string name { get; set; }
public string value { get; set; }
}
公共类Rootobject2
{
公共int id{get;set;}
公共字符串用户名{get;set;}
公共IDictionary标记{get;set;}
}
公共类名称值对
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
尽管将Json粘贴为类是一个很好的起点,可以轻松地将代码复制并粘贴到喜欢的解决方案中
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; }
}
一些测试代码
string json = Resource1.String1;
Rootobject test = JsonConvert.DeserializeObject<Rootobject>(json);
Rootobject2 test2 = JsonConvert.DeserializeObject<Rootobject2>(json);
string json=Resource1.String1;
rootobjecttest=JsonConvert.DeserializeObject(json);
rootObject2test2=JsonConvert.DeserializeObject(json);
示例中的标记是单个对象。如果它是一个数组,它将被包装在@Zinov的[]
可能的副本中。这两个问题都是关于json反序列化的,这个问题的答案非常简单,而且已经有足够的stackoverflow信息来解决它。然而,这个问题是关于反序列化一个特定的模式的,它与您链接的问题中的数据模式不同。我也这样做了,得到了相同的结果,“无效名称”部分似乎暗示JSON无效?@motor75:您需要从源代码确认此JSON。不需要更改属性名称。“无效名称”是因为在C#中不能有带空格的属性名,但在Javascript中可以。这个名字不是无效的——只是C#没有那么有表现力。尝试使用[JsonProperty(“Employee ID”)]公共字符串EmployeeId{get;set;}
或类似的方法。我认为这就是解决方案,但我遇到了以下错误:附加信息:解析值时遇到意外字符:{.Path'标记['Employee ID']',第1行,第835位它显示为“Employee ID”需要删除空格吗?嗯,我删除了空格(添加了一个下划线),但没有解决此问题:解析值时遇到意外字符:{.Path'tags.Employee_ID',第1行,第835位。这个答案非常有效-显示如何将JSON粘贴到类中的链接非常有用。我把它放在代码中,一切都正常。我将它标记为解决方案,并给它一个+1(它没有显示,因为我在这个网站上还是太新了)。谢谢你的帮助!
string json = Resource1.String1;
Rootobject test = JsonConvert.DeserializeObject<Rootobject>(json);
Rootobject2 test2 = JsonConvert.DeserializeObject<Rootobject2>(json);