【发布时间】:2015-03-30 03:25:24
【问题描述】:
在我的应用程序中,我使用 newtonsoft 来序列化和反序列化对象,我想知道是否有任何内置 API 来确定输入字符串是否可以反序列化为特定对象?
public TObject Deserialize<TObject>(string serialized)
{
/// I want check the condition, and if is not serialized string just return default(TObject)
return JsonConvert.DeserializeObject<TObject>(serialized);
}
我不想使用try catch。目前我是这样实现的,但希望在开始反序列化对象之前找到一种方法来验证字符串。
我已经看到这个问题Deserialize json in a "TryParse" way,但这不是我的答案,因为我没有任何特定的架构并且 JSON 格式可以动态更改。
【问题讨论】:
-
Ummm... 文档没有说什么,但实验有什么问题?给它提供损坏的数据,看看它是如何反应的。我敢打赌,它要么引发异常,要么返回 null(可能是
default(T)来处理结构)。在后一种情况下,如果它引发异常try并返回default(),则无需执行任何操作。 -
我不想使用 try catch。目前我是这样实现的,但希望在开始反序列化对象之前找到一种方法来验证字符串
-
你为什么不想使用
try-catch?为什么要在解析 JSON 之前对其进行解析? JSON 也可能有效,但由于多种原因不能反序列化为TObject。只需使用异常来处理无效输入,或者确切说明您不想使用try-catch的原因。 -
@Alexander 当然,但我在问 OP。无效 JSON 是否是异常取决于用例,
Try...方法很可能无论如何都会在内部吞下异常。作为用户,您可能希望查看实际异常而不是false或null检查。如果只是输入验证,OP could use Json Schema,但根据模式有效的 JSON 仍然可能失败,例如当它没有映射到目标类时。 -
@CodeCaster 实际上,支持
TryAction习惯用法的类是反其道而行之。Action在内部使用TryAction,如果失败,则会引发异常。问题是要避免执行路径中的异常,因为它会花费成本,因此使用一个额外的if来检查我们是否应该抛出并不是那么痛苦,而且无论如何执行路径都会变得混乱。在Try中隐藏异常会破坏它的主要目的,即不是改变语义,而是避免try...catch在执行路径中。无论如何,选择的 OP 软件不支持它,所以他们需要变通。