无法将返回的 Json 解析为对象,对象最终为 null

本文关键字:对象 null 返回 Json | 更新日期: 2023-09-27 18:08:03

所以我有一些json,我正在尝试使用Newtonsoft Json库进入一个可引用的对象,但我真的被这个难住了。基本上,我的数据如下所示:

{
    "43086": [{
        "name": "Karthus's Brigands",
        "tier": "SILVER",
        "queue": "RANKED_SOLO_5x5",
        "entries": [{
            "playerOrTeamId": "43086",
            "playerOrTeamName": "Testy Test",
            "division": "IV",
            "leaguePoints": 77,
            "wins": 130,
            "isHotStreak": false,
            "isVeteran": true,
            "isFreshBlood": false,
            "isInactive": false
        }]
    }]
}

当我尝试创建一个对象来保存此数据并使用反序列化对象函数时,我的对象总是以 null 结尾,并且不会引发异常。

尝试手动创建对象,但是一旦遇到麻烦,我就通过json2csharp运行返回的json,它给了我这个:

public class Entry
{
public string playerOrTeamId { get; set; }
public string playerOrTeamName { get; set; }
public string division { get; set; }
public int leaguePoints { get; set; }
public int wins { get; set; }
public bool isHotStreak { get; set; }
public bool isVeteran { get; set; }
public bool isFreshBlood { get; set; }
public bool isInactive { get; set; }
}
public class invalid_type43086
{
public string name { get; set; }
public string tier { get; set; }
public string queue { get; set; }
public List<Entry> entries { get; set; }
}
public class RootObject
{
public List<invalid_type43086> invalid_name43086 { get; set; }
}

我在这个 API 上遇到了其他问题,该转换器无法识别对象,所以我清理了这些问题,但仍然没有骰子。

这是我用于反序列化的代码行:

var leagueStats = JsonConvert.DeserializeObject<SummonerClasses.RootObject>(returnedData);

如前所述,leagueStats在此之后立即变为空。我已经确认returnedData实际上持有上述 json,所以我不确定问题是什么,特别是因为它没有引发任何异常。单步执行代码没有提供任何见解。

我还尝试使用 newtonsoft 库中的 PopulateObject 方法,并构建字典,但这也失败了(我收到一个关于它无法序列化为不可索引对象的错误,但我不确定具体错误是什么,因为一旦很明显它也不会成功,我就吹走了该代码(。

有人有什么建议吗?我正在针对此 API 的其他端点使用相同的实现,并且它可以正常工作。我注意到的唯一区别是此响应的列表值同时包装在[{括号中,而其他端点仅使用{括号返回列表值。

无法将返回的 Json 解析为对象,对象最终为 null

您可以

尝试反序列化为一个Dictionary<int, Item[]>,该应该与您在问题中显示的JSON文件相对应:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
public class Entry
{
    public string PlayerOrTeamId { get; set; }
    public string PlayerOrTeamName { get; set; }
    public string Division { get; set; }
    public int LeaguePoints { get; set; }
    public int Wins { get; set; }
    public bool IsHotStreak { get; set; }
    public bool IsVeteran { get; set; }
    public bool IsFreshBlood { get; set; }
    public bool IsInactive { get; set; }
}
public class Item
{
    public string Name { get; set; }
    public string Tier { get; set; }
    public string Queue { get; set; }
    public List<Entry> Entries { get; set; }
}
static class Program
{
    static void Main()
    {
        string returnedData =
        @"{
            ""43086"": [{
                ""name"": ""Karthus's Brigands"",
                ""tier"": ""SILVER"",
                ""queue"": ""RANKED_SOLO_5x5"",
                ""entries"": [{
                    ""playerOrTeamId"": ""43086"",
                    ""playerOrTeamName"": ""Testy Test"",
                    ""division"": ""IV"",
                    ""leaguePoints"": 77,
                    ""wins"": 130,
                    ""isHotStreak"": false,
                    ""isVeteran"": true,
                    ""isFreshBlood"": false,
                    ""isInactive"": false
                }]
            }]
        }";
        var leagueStats = JsonConvert.DeserializeObject<Dictionary<int, Item[]>>(returnedData);
        Console.WriteLine(leagueStats.Count);
    }
}

所以基本上不要相信任何自动工具,这些工具会为你生成像invalid_name43086这样的废话,并认为他们会代替你完成工作。查看您拥有的 JSON 对象,并考虑如何在 C# 对象中表示此 JSON 结构。然后,JSON 序列化程序将为您完成其余的工作。