【问题标题】:TryGetInt32 throws System.InvalidOperationExceptionTryGetInt32 抛出 System.InvalidOperationException
【发布时间】:2021-09-07 20:23:43
【问题描述】:

说我疯了,但我的印象是有一个 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() 有什么区别?

【问题讨论】:

    标签: json.net system.text.json


    【解决方案1】:

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

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

    我希望以下额外检查对您有所帮助:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 当我使用 TryGetInt32 时,它会抛出而不是返回 false,这是我对 GetInt32 的期望。
      猜你喜欢
      • 2015-11-07
      • 2018-03-08
      • 1970-01-01
      • 2018-02-23
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多