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
相关产品推荐
相关产品推荐

