【问题标题】:Java processing JSONJava处理JSON
【发布时间】:2014-05-09 19:25:53
【问题描述】:

我从 HTTP 请求 API 中得到不同类型的 JSON 响应。可能有几个从 API 返回的 JSON 格式选项。例如,它可能是带有预期数据的有效响应,但在某些情况下,它可能是内部服务器错误详细消息。

目前我正在使用 Gson 将传入的字符串转换为对象,但由于有时它以不同的格式出现,Gson 无法将其转换为提供了不同的模板类。

注意: 错误并不意味着异常。例如,JSON 正文仅包含身份验证失败的信息,例如,调用成功且 JSON 正文为 VALID。 HTTP 实际上总是成功的,将是 200。问题是有时身份验证可能会失败,它会返回不同的 JSON。

String response = restTemplate.getForObject(request, String.class);
ObjectResponse objResponse = gson.fromJson(response, ObjectResponse.class);

您能否建议更好的方法,以便我可以处理不同类型的响应?或者,也许您知道完全不同的方法。

谢谢!

【问题讨论】:

  • 请注意,HTTP 标头具有状态码。您可能想要使用它(200 = 正常,404 = 未找到,500 = 内部服务器错误等)
  • 嗯,你总是可以像大多数非 Java 世界那样做——解析成 Maps 和 Lists,然后检查生成的树。如果您需要创建一个对象,请编写一个接受 Map 的构造函数——流程真的很自然。

标签: java json gson


【解决方案1】:

如果您无法预测响应的结构,请将其映射到由简单 Java 映射、数组和字符串组成的树。 Jackson 库通过“readTree”方法支持这一点。一旦您查看了树并确定了它是什么,您就可以要求库将树映射到类的对象。

【讨论】:

  • 谢谢!大概这个最适合我吧!
【解决方案2】:

一种选择是创建一个表示 JSON 数据的类,然后反序列化为该类。这样,如果数据与该结构不匹配,就会出现异常。

当您尝试创建对象但它失败时,捕获异常并尝试将其解码为错误 - 然后您可以根据需要处理这种情况(以及它既不是您期望的对象也不是您期望的对象的潜在情况)一个有效的错误)。

【讨论】:

  • 错误并不意味着异常。例如,JSON 正文仅包含身份验证失败的信息,例如,调用成功且 JSON 正文为 VALID。
  • @WildGoat 事实上,我误读了您的帖子,并认为您正在将您的类序列化/反序列化为 JSON - 因此尝试反序列化与您的类不匹配的 JSON 会导致异常。我会更新我的答案。
【解决方案3】:

检查 HTTP 响应代码。如果您收到不正常的状态代码(200),那么您不应该尝试解析成功的响应。例如,您可以像这样检查代码并处理响应(对象类型不是实际的 Java 类型,而是提供示例):

MyHttpResponse response = MyHttpHelper.execute(...);
int status = response.getMyStatusCode();
String responseData = response.getStringBody();
switch(status) {
    case 200: {
        //request is successful, parse valid data
        break;
    }
    default: {
        //request is not valid, parse error data
        break;
    }
}

【讨论】:

  • 感谢您的回答,但 HTTP 实际上总是成功的,将是 200。问题是有时身份验证可能会失败,它会返回不同的 JSON。
  • 太糟糕了。状态码不应该总是 200!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2012-04-29
相关资源
最近更新 更多