You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

System.Text.Json中TryGetInt32抛出InvalidOperationException问题咨询

System.Text.Json 使用问题解答

问题1:如何判断返回内容是纯数值,还是包含数值和字符串的对象?

System.Text.Json 中所有JsonElement实例都带有ValueKind属性,该属性会直接标识当前JSON节点的类型,你只需要先校验ValueKind即可完成类型判断,再执行后续逻辑,示例代码如下:

using (var jsonDoc = JsonDocument.ParseValue(ref reader))
{
    var root = jsonDoc.RootElement;
    // 判断根节点为数值类型
    if (root.ValueKind == JsonValueKind.Number)
    {
        if (root.TryGetInt32(out int number))
        {
            // 处理纯数值逻辑
        }
    }
    // 判断根节点为对象类型
    else if (root.ValueKind == JsonValueKind.Object)
    {
        // 按需读取对象内的属性,示例假设数值存在value字段、字符串存在text字段
        if (root.TryGetProperty("value", out var valueProp) 
            && valueProp.ValueKind == JsonValueKind.Number
            && valueProp.TryGetInt32(out int objNumber))
        {
            // 处理对象内的数值逻辑
        }
        if (root.TryGetProperty("text", out var textProp)
            && textProp.ValueKind == JsonValueKind.String)
        {
            string text = textProp.GetString();
            // 处理对象内的字符串逻辑
        }
    }
}

问题2:TryGetInt32(out int number)和GetInt32()的具体区别是什么?

你遇到的异常是因为这两个方法的设计和常规带Try前缀的方法约定不同:

  • 两个方法的通用前提:只有当前JsonElement的ValueKind为JsonValueKind.Number时才可以正常调用,只要节点类型不是数值,两个方法都会直接抛出InvalidOperationException,没有区别。
  • 二者的差异仅在处理数值范围的场景:
    • 调用GetInt32()时,如果当前数值超出了int类型的可表示范围,会直接抛出OverflowException;
    • 调用TryGetInt32()时,如果当前数值超出了int类型的可表示范围,会返回false,不会抛出异常,仅返回转换失败的状态。

内容的提问来源于stack exchange,提问作者spovelec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:48:03