【问题标题】:C# JSON deserialization returns nullC# JSON 反序列化返回 null
【发布时间】:2019-09-09 11:28:21
【问题描述】:

我正在尝试从 Valve 的 API 反序列化一些 JSON 格式的统计数据。下面的代码在反序列化时不会抛出任何异常,只有在之后尝试使用统计信息时才会抛出异常。反序列化后,所有统计信息都没有值。 Valve 的响应如下所示:

"playerstats":{ 
      "steamID":"",
      "gameName":"",
      "stats":[ 
         { 
            "name":"deaths",
            "value":5062
         }, etc etc..

这是我的 Rust 课程(Rust 是我从中获取统计数据的游戏。):

public class Rust
{
    public int steamID { get; set; }
    public string gameName { get; set; }
    public Array stats { get; set; }
}

这是反序列化代码:

Rust getStats = JsonConvert.DeserializeObject<Rust>(str);

foreach (var stat in getStats.stats) //< ----- Exception: Object reference not set to an instance of an object.
{
    parsed += stat.ToString();
}

'parsed' 然后返回并用于打印所有统计信息,'str' 是 Valve 的 json 响应。我将整个 JSON 响应粘贴到 pastebin 以防上述数据不够:https://pastebin.com/uJZSTF3G

我尝试在 Rust 类中单独命名一些统计信息,而不是使用数组。

我希望输出显示所有反序列化的统计信息,例如在控制台中。

【问题讨论】:

  • public Array stats { get; set; },我认为这可以改进一点。您能否为数组的内容创建一个具有两个属性的类定义,即name 和value?然后将 Array 替换为您的 List&lt;YOUR-NEW-CLASS&gt;。希望对您有所帮助。
  • 谢谢,一旦我得到这个工作,我一定会这样做。

标签: json json-deserialization


【解决方案1】:

正如@Bagus Tesa 建议的那样,尝试类似...

public class Rust
{
    public int steamID { get; set; }
    public string gameName { get; set; }
    public List<RustStat> stats { get; set; }
}

public class RustStat
{
    public string name { get; set; }
    public string value { get; set; }
}

编辑

我将 steamID 属性更改为字符串,并在下面添加了完整代码。这为我成功编译。希望这会有所帮助!

public class Valve
{
    public Rust playerstats { get; set; }
}

public class Rust
{
    public string steamID { get; set; }
    public string gameName { get; set; }
    public List<RustStat> stats { get; set; }
}

public class RustStat
{
    public string name { get; set; }
    public string value { get; set; }
}

Valve valve = JsonConvert.DeserializeObject<Valve>(str);

foreach (RustStat stat in valve.playerstats.stats)
{

}

【讨论】:

  • 我刚刚这样做了,但我仍然得到对象引用异常,知道为什么会这样或如何解决它吗?
  • @overflowstack 为您提供了我的工作代码。我将“str”变量更改为“json”,但这应该会有所帮助!
  • @overflowstack 我错过了另一个细节,那就是 JSON 有效负载中的顶级“playerstats”元素。我在测试中删除了这个。如果您需要按原样使用整个有效负载,则必须为此包含另一个具有一个 Rust 属性的顶级类。对困惑感到抱歉。如果您愿意,我可以更新我的答案。
  • 如果你能用最有用的顶级类来更新它,我对 C# 还很陌生,而且我对 JSON 完全没有经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多