C# 如何将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

我有以下JSON(我无法更改传入的JSON,因为它来自第三方系统):

首先,我尝试使用以下类结构进行反序列化:

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