我有一些看起来像这样的代码:
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)在元组中返回null值或b)返回SomeObjectModel的新的新实例?是否有任何性能影响?
感谢您的建议。
答案 0 :(得分:2)
让我提出三种替代解决方案:
ParseJsonIfValid :如果反序列化有效,则TheObjectModel始终为非null。因此,不需要布尔值:
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
可以是有效的反序列化,则可以使用以下模式,其优势与{{1}一致.NET框架的方法:
TryParse