Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化JSON字典<;int、CustomType>;列出<;客户类型>;_C#_Json_Json.net - Fatal编程技术网

C# 反序列化JSON字典<;int、CustomType>;列出<;客户类型>;

C# 反序列化JSON字典<;int、CustomType>;列出<;客户类型>;,c#,json,json.net,C#,Json,Json.net,我需要将Dictionary类型的JSON字典反序列化为一个列表(List),为此我使用JSON.Net。当然,这是一个惊人的图书馆,只是我有点卡住了 我订阅了一些API,您可以看到下面的响应: "team_details": { "0": { "index": 1, "team_id": "1..", "team_name": "Res

我需要将Dictionary类型的JSON字典反序列化为一个列表(List),为此我使用JSON.Net。当然,这是一个惊人的图书馆,只是我有点卡住了

我订阅了一些API,您可以看到下面的响应:

    "team_details": {
                "0": {
                    "index": 1,
                    "team_id": "1..",
                    "team_name": "Research Team",
                    "team_url": "...",
                    "role": "Administrator"
                },
                "1": {
                    "index": 2,
                    "team_id": "2..",
                    "team_name": "WB Team",
                    "team_url": "...",
                    "role": "User"
                }
}
我需要使用它将其转换为
列表
,其中团队:

Class Teams{

 public int Index{get;set;}

 public String TeamName{get;set;}

...
}

最简单的方法是反序列化到
字典中
,然后在需要时使用
Dictionary.values.ToList()
将值放入列表中

但是,如果您确实希望在类定义中有一个
列表
,则可以使用自定义的
JsonConverter
在反序列化过程中进行转换

public class TeamListConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<Team>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        return token.Values().Select(v => v.ToObject<Team>()).ToList();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

首先,你确定你的?这个JSON是有效的吗?这个列表不是作为数组存储的,而是作为键值对象存储的,其中键是索引。是的,它是有效的,它的内部是一个JSON字典。只有在它周围加上大括号,它才是有效的。在解析之前,请确保您拥有有效的JSON。我把它算作一个简单的复制粘贴错误。没问题;很乐意帮忙。
class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""team_details"": {
                ""0"": {
                    ""index"": 1,
                    ""team_id"": ""1.."",
                    ""team_name"": ""Research Team"",
                    ""team_url"": ""..."",
                    ""role"": ""Administrator""
                },
                ""1"": {
                    ""index"": 2,
                    ""team_id"": ""2.."",
                    ""team_name"": ""WB Team"",
                    ""team_url"": ""..."",
                    ""role"": ""User""
                }
            }
        }";

        RootObject root = JsonConvert.DeserializeObject<RootObject>(json);

        foreach (Team team in root.Teams)
        {
            Console.WriteLine(team.TeamName);
        }
    }
}

public class RootObject
{
    [JsonProperty("team_details")]
    [JsonConverter(typeof(TeamListConverter))]
    public List<Team> Teams { get; set; }
}

public class Team
{
    [JsonProperty("index")]
    public int Index { get; set; }
    [JsonProperty("team_id")]
    public string TeamId { get; set; }
    [JsonProperty("team_name")]
    public string TeamName { get; set; }
    [JsonProperty("team_url")]
    public string TeamUrl { get; set; }
    [JsonProperty("role")]
    public string Role { get; set; }
}
Research Team
WB Team