JsonSerializer 尝试 DeserializeFromString

Posted

技术标签:

【中文标题】JsonSerializer 尝试 DeserializeFromString【英文标题】:JsonSerializer try to DeserializeFromString 【发布时间】:2014-07-16 12:25:42 【问题描述】:

当我处理可能是错误的json 响应时,我使用此方法来确定json实际上是错误 还是可能是预期的响应强>:

bool TryParseResponseToError(string jsonResponse, out Error error)

    // Check expected error keywords presence
    // before try clause to avoid catch performance drawbacks
    if (jsonResponse.Contains("error") &&
        jsonResponse.Contains("status") &&
        jsonResponse.Contains("code"))
    
        try
        
            error = new JsonSerializer<Error>().DeserializeFromString(jsonResponse);
            return true;
        
        catch
        
            // The JSON response seemed to be an error, but failed to deserialize.
            // It may be a successful JSON response : do nothing.
        
    

    error = null;
    return false;

但是,我有一个空的捕获,这是一种不好的代码气味。

我在 ServiceStack 库中没有看到任何 TryToDeserialize 类型的方法。有吗?

您如何使用 ServiceStack 处理 json 错误?

【问题讨论】:

您可以构建自己的TryToDeserialize 扩展方法。顺便说一句,似乎几乎每个人都使用JSON.NET 而不是内置的序列化程序。 扩展方法是个好主意,谢谢。您能否提供有关 Json.Net 方式而不是 JsonSerializer 的更多详细信息? 您只需要查看他们的文档,这非常好。我支持@tvanfosson,您应该使用 HTTP 状态代码而不是 JSON 对象来表示错误。 是的,我同意这样会更好......但我不拥有这项服务。 我的问题问得不好,我在这里改写一下:[以“TryParse”方式反序列化json][1] [1]:***.com/questions/23906220/… 【参考方案1】:

对于 ServiceStack,错误处理有据可查: https://github.com/ServiceStack/ServiceStack/wiki/Error-Handling

基本上,您将收到 HTTP 400、405、403 或 500 错误状态响应。

否则,您可以将其视为成功。

如果是错误,您将在 JSON 响应中收到 ResponseStatus DTO。它包含属性:

公共字符串错误代码 公共字符串消息 公共字符串 StackTrace 公共列表 错误

这应该给你你想要的。

更新: 如果您实际上对服务代码或发送的错误没有任何控制或知识,并且您正在编写 HTTP 客户端应用程序,则需要手动检查服务“通过网络”返回的内容。

换句话说,您希望服务在响应 JSON 中返回错误,但您不知道 JSON 的格式是什么。因此,您不能将其序列化为类型。

检查 HTTP 响应 JSON 的一个好方法是使用 Fiddler utility。它将自己安装在您的 Web 浏览器和远程 Web 服务器(作为代理)之间。您可以点击服务 url,然后查看 Fiddler 响应(JSON 或 RAW)。看到原始响应后,您将了解如何创建适合将 JSON 序列化为的 C# 类。

【讨论】:

我刚刚意识到一件事:我不拥有我请求的服务,我不知道它是否是 ServiceStack 的。实际上,我只是使用 JsonSerializer 来反序列化给定的 json 响应。我的问题问得不好…… 如果是这种情况,我建议更新您的问题以删除 servicestack 标记并询问:如何使用 JsonSerializer 反序列化 json 响应,我不知道错误格式?【参考方案2】:

这似乎是检查是否存在错误的不好方法。通常,您会尝试使用某种响应对象,并将您的错误对象作为成员变量。您需要将 jsonResponse 字符串反序列化为响应对象,以正确隔离所有必填字段。这样您就可以避免空的 catch 块并更好地处理反序列化。

【讨论】:

感谢您的即时答复。不幸的是,我不拥有该服务,我必须处理它:返回一个错误并返回 HTTP 200 OK。响应要么只是数据,要么只是错误。【参考方案3】:

一般来说,我想使用 HTTP 状态代码来表示错误,而不是按照预期的消息格式对其进行编码。因此,200 OK 响应将包含来自 API 的有效 JSON 数据,但其他响应(即 4xx、5xx)表示错误。在后一种情况下,您会将消息解码为错误而不是预期的响应。

在不可能的情况下,可能是由于历史原因,我看到的模式是在 JSON 对象周围使用包装器。

错误:


   success = false,
   message = "There was an error.",
   data = null

成功:


    success = true,
    message = null,
    data =  .... 

【讨论】:

感谢闪电般的快速回答。不幸的是,所请求的服务不会处理这样的响应(我无法更改):返回一个错误并返回 HTTP 200 OK。响应要么只是数据,要么只是错误。

以上是关于JsonSerializer 尝试 DeserializeFromString的主要内容,如果未能解决你的问题,请参考以下文章

即使 JsonSerializer 工作,改装响应为空

C# JsonSerializer.Serialize 在生成的json中添加键值

Rest Sharp request.JsonSerializer.Serialize(Myobj) 抛出空引用异常

如何使用 ServiceStack JsonSerializer 序列化 Hashtable?

JsonSerializer 在反序列化期间不使用内部构造函数

我可以为 POST 和 PUT API 请求使用自定义 JsonSerializer 来处理接口参数吗?