2014-05-09 51 views
0

我从HTTP请求API中获取不同类型的JSON响应。可能会有几个来自API的JSON格式选项。例如,它可能是对预期数据的有效响应,但在某些情况下,它可能是内部服务器错误详细消息。Java处理JSON

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

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

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

请问您能否提出更好的做法,以便我可以处理不同类型的响应?或者,也许你知道完全不同的做法。

谢谢!

+1

请注意,HTTP标头具有状态码。你可能想要使用它(200 = OK,404 =未找到,500 =内部服务器错误等) – enlait

+0

那么,你可以像大多数非Java世界一样做 - 解析地图和列表,然后检查生成的树。如果你需要创建一个对象,写一个接受Map的构造函数 - 这个流程真的很自然。 –

回答

1

如果你不能预测响应的结构,将其映射到简单的Java地图,数组和字符串树。杰克逊图书馆用'readTree'方法支持这一点。一旦你看到树并决定它是什么,你可以让图书馆将树映射到一个类的对象。

+0

谢谢!可能这对我来说最适合我! –

1

一种选择是创建一个表示JSON数据的类,并反序列化为该类。这样,如果数据与该结构不匹配,您将得到一个异常。

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

+0

错误并不意味着例外。例如,JSON主体仅包含验证失败的信息,例如,调用已成功完成,并且JSON正文为有效。 –

+0

@WildGoat事实上,我误解了你的文章,并认为你将序列化/反序列化为JSON类 - 所以试图反序列化与你的类不匹配的JSON会导致异常。我会更新我的答案。 –

-1

检查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; 
    } 
} 
+0

感谢您的回答,但HTTP实际上总是成功,并且将是200.问题是,有时身份验证可能会失败,并且它将返回不同的JSON。 –

+0

太糟糕了。状态码不应该总是200! – binnyb