TryGetInt32 抛出 System.InvalidOperationException

TryGetInt32 throws System.InvalidOperationException

说我疯了,但我的印象是有一个 try 的约定,这意味着试一试,但如果你不能,请回复我并告诉我它是一个“不行”。

我最近开始了一个新项目,我决定使用 System.Text.Json 而不是 Newtonsoft,因为它已经推出一段时间了,我喜欢玩新东西。

我在 JsonConverter 中有以下代码:

using (var jsonDoc = JsonDocument.ParseValue(ref reader))
{
    if (jsonDoc.RootElement.TryGetInt32(out int number))
    {
    }
}

当它是一个数字时,它运行得非常好,但是当它不是一个数字时,它就会抛出,就像我在调用 GetInt32()

在自定义转换器中,我有时会返回一个数字,但我也可以获得一个对象,其中包含我期望的数字以及一个字符串。我认为我可以使用 TryGetInt32 方法对此进行测试。

我有两个问题:

  1. 我如何测试我是在取回号码,还是在获取号码和字符串?,
  2. TryGetInt32(out int number)GetInt32()有什么区别?

第一个问题: 使用 int.TryParse(variable,result) :此 return bool 并存储变量(如果结果为整数) 示例:

 string json = "5";
        int result;
        if (int.TryParse(json, out result))
        {
            Console.WriteLine(result);
        }

第二个问题: TryGetInt32(Int32) :尝试将当前 JSON 数字表示为 Int32 和 return bool 。 Getint32():获取特定值作为 int32 在这种情况下你必须确保该值是整数

如果值不是数字类型,TryGetInt32 将抛出异常。

如果值是数字类型但不是可转换为 int32 的数字类型,则不会抛出 returns false。

希望以下附加检查对您有所帮助:

using (var jsonDoc = JsonDocument.ParseValue(ref reader))
{
    if(jsonDoc.RootElement.ValueKind == JsonValueKind.Number &&
       jsonDoc.RootElement.TryGetInt32(out int number))
    {
    }
}