1

我有一些看起来像这样的代码:

public Tuple<bool, SomeObjectModel> CheckIfJsonIsValid(string IncomingJson)
{
   SomeObjectModel TheObjectModel = new SomeObjectModel();
   JavascriptSerializer TheSerializer = new JavascriptSerializer();
   .....

   try
   {
       TheObjectModel = TheSerializer.Deserialize<SomeObjectModel>(IncomingJson);
   }
   catch
   {
       return new Tuple<bool, SomeObjectModel>(false, null); //question here
   }

   .....
   return new Tuple<bool, SomeObjectModel>(true, TheObjectModel);
}

调用方法首先检查返回元组的 Item1,如果为 false,则结束其进程。

更好的做法是 a) 在元组中返回空值还是 b) 返回 SomeObjectModel 的新实例?是否有任何性能影响?

感谢您的建议。

4

1 回答 1

2

让我建议三个替代解决方案:


ParseJsonIfValid:如果反序列化有效,则 TheObjectModel 始终为非空。因此,不需要布尔值:

public SomeObjectModel ParseJsonIfValid(string IncomingJson)
{
   JavascriptSerializer TheSerializer = new JavascriptSerializer();
   .....

   try
   {
       return TheSerializer.Deserialize<SomeObjectModel>(IncomingJson);
   }
   catch
   {
       return null;
   }
}

在调用函数中只需检查返回值是否为空。


ParseJson:如果 JSON通常是有效的,而无效的 JSON 是出现严重错误的迹象,只需抛出异常:

public SomeObjectModel ParseJson(string IncomingJson)
{
   JavascriptSerializer TheSerializer = new JavascriptSerializer();
   .....

   try
   {
       return TheSerializer.Deserialize<SomeObjectModel>(IncomingJson);
   }
   catch (Exception e)
   {
       throw new TheServerSentRubbishException(e);
   }
}

确保包含内部(“真实”)异常,以便调用函数可以记录错误的真正原因以进行调试。


TryParseJson:如果null可以是有效的反序列化,则可以使用以下模式,其优点是与TryParse.NET框架的方法一致:

public bool TryParseJson(string IncomingJson, out SomeObjectModel theObjectModel)
{
   JavascriptSerializer TheSerializer = new JavascriptSerializer();
   .....

   try
   {
       theObjectModel = TheSerializer.Deserialize<SomeObjectModel>(IncomingJson);
       return true;
   }
   catch (Exception e)
   {
       return false;
   }
}
于 2013-02-08T08:08:36.617 回答