c# - 为什么 System.Text.Json.JsonElement 没有 TryGetString() 或 TryGetBoolean()
问题描述
我正在使用System.Text.Json
返回JsonElement
对象的 .NET Core 命名空间解析一些 JSON 数据。
例如,对于 Int32 类型,JsonElement
有一个GetInt32()
会将值作为整数返回,如果不是整数则抛出异常,还有一个TryGetInt32()
将解析后的值复制到out
变量并根据是否返回 true 或 false它能够正确解析。
这同样适用于几乎所有其他原始类型,但出于某种原因,GetBoolean()
并且GetString()
没有try...
等效项,即使如果无法正确解析值,它们也会抛出异常。
这似乎是一个明显的疏忽,它让我觉得我做错了什么。谁能解释为什么不需要它们?
解决方案
UPD
不要介意最初的答案,这些TryGet_number_type
方法不像我(我假设你)所期望的那样工作 - 如果你尝试从ValueKind
不是 a 的元素Number
(例如decimal
文档)中获取“number_type”,它们会抛出。
因此,此TryGet...
API 基本上尝试将内部值解析为某种具体类型,但前提是该尝试的具体类型的值是有效的json 类型Number
(对于所有数字类型,forString
和),否则它将抛出,因此没有意义有一个and方法,因为这里没有歧义(字符串总是字符串,布尔值总是布尔值),它们的行为与对应物完全相同。Guid
DateTime
DateTimeOffset
InvalidOperationException
TryGetString
TryGetBoolean
Get
原始答案:
无法找到没有此 API 的任何理由,但自己实现它们应该不是一个大问题(在标准库中使用它们仍然会很好):
根据docs GetBoolean
throws if value's ValueKind
is not True
nor False
。
public static bool TryGetBoolean(this JsonElement je, out bool parsed)
{
var (p, r) = je.ValueKind switch
{
JsonValueKind.True => (true, true),
JsonValueKind.False => (false, true),
_ => (default, false)
};
parsed = p;
return r;
}
如果值既不是也GetString
抛出:ValueKind
String
Null
public static bool TryGetsString(this JsonElement je, out string parsed)
{
var (p, r) = je.ValueKind switch
{
JsonValueKind.String => (je.GetString(), true),
JsonValueKind.Null => (null, true),
_ => (default, false)
};
parsed = p;
return r;
}
和样品测试:
using (JsonDocument document = JsonDocument.Parse(@"{""bool"": true, ""str"": ""string""}"))
{
if (document.RootElement.GetProperty("bool").TryGetBoolean(out var b))
{
Console.WriteLine(b);
}
if (document.RootElement.GetProperty("str").TryGetString( out var s))
{
Console.WriteLine(s);
}
}
推荐阅读
- powershell - 如何根据 PowerShell 中的长集验证参数?
- python - 给定笔画的一些坐标(x,y),如何平滑笔画?
- java - notifyDataSetChanged 在片段上无法正常工作
- javascript - 如何在 Cocos Creator 中编码 HTML 字符串?
- r - 之间的区别!!和 mutate_at 中的 eval_tidy
- kubernetes - Kops kubenet 集群自动缩放不起作用
- c++ - 调用 glGetString 时出现访问冲突错误
- spring-cloud - Spring Cloud Stream 中的确认消息
- powershell - 如何使用 rundeck 运行位于远程服务器中的 Powershell 文件
- javascript - 通过 HTTP 传输的文件仅部分写入