【问题标题】:Can I determine whether the string can deserialize by newtonsoft?我可以确定字符串是否可以被 newtonsoft 反序列化吗?
【发布时间】: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... 方法很可能无论如何都会在内部吞下异常。作为用户,您可能希望查看实际异常而不是 falsenull 检查。如果只是输入验证,OP could use Json Schema,但根据模式有效的 JSON 仍然可能失败,例如当它没有映射到目标类时。
  • @CodeCaster 实际上,支持TryAction 习惯用法的类是反其道而行之。 Action 在内部使用 TryAction,如果失败,则会引发异常。问题是要避免执行路径中的异常,因为它会花费成本,因此使用一个额外的if 来检查我们是否应该抛出并不是那么痛苦,而且无论如何执行路径都会变得混乱。在Try 中隐藏异常会破坏它的主要目的,即不是改变语义,而是避免try...catch 在执行路径中。无论如何,选择的 OP 软件不支持它,所以他们需要变通。

标签: c# json.net


【解决方案1】:

截至当前版本,Json.Net 中没有 TryParse。如果您没有要验证的已知架构,并且您不想使用try...catch,那么我可以看到的唯一其他选择是将错误处理程序附加到序列化程序并将其用作检测方法和/或处理错误。请参阅文档中的"Error Handling"

【讨论】:

    【解决方案2】:
        private static bool TryParseJSON(string json, out JObject jObject)
        {
            try
            {
                jObject = JObject.Parse(json);
                return true;
            }
            catch
            {
                jObject = null;
                return false;
            }
        }
    

    在我的场景中工作得很好

    【讨论】:

    • 你的建议很中肯。谢谢你的想法
    • 包装里没有这个真是太神奇了。
    • 有趣...我不知道使用 catch 没有异常声明的可能性(或者我忘记了)。如果我不想捕捉任何东西,我总是使用catch (Exception) - 没有变量。
    【解决方案3】:

    This thread 使用 Newtonsoft.Json.Schema 的最新包实现了不错的 TryParse。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2011-08-07
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多