当响应没有达到预期时,如何用GSON解析json?

时间:2013-02-28 18:55:47

标签: java json parsing gson

我正在开发与Rest服务的集成,其响应是JSON。

我做的第一个请求是登录,其中有两个可能的返回。

通常,正面登录响应如下所示:

    {"data":{"userID":"4f561b74001ff932afd58200a752b821","sessionID":"6cc960751eef45db83dd8db7f47337a6","versionInformation":{"currentAPI":"v2.0","buildNumber":"28b12d751c5ea88d393e68285ac57ed309ae04fa","apiVersions":{"v1.0":"\/attask\/api\/v1.0\/","v2.0":"\/attask\/api\/v2.0\/"},"lastUpdated":"2013\/02\/12 17:42:57","release":"R16","version":"4.0"},"locale":"pt_BR","timeZone":"America\/Sao_Paulo","timeZoneName":"Brasilia Time","iso3Country":"BRA","iso3Language":"por","currency":{"useNegativeSign":true,"fractionDigits":2,"symbol":"R$","ID":"BRL","groupingSeparator":".","decimalSeparator":","}}}

使用GSON反序列化我没有问题,假设它永远不会改变格式。但是,如果JSON响应以不同的方式出现呢?就像我尝试使用错误的用户名/密码登录一样?

否定回答将是这样的:

    {"error":{"class":"com.attask.biz.externallogin.ExternalLoginException","message":"The following error occurred while authenticating with an external system: Invalid password"}}

所以我的问题是,有没有办法让GSON选择最适合反序列化的对象,或者我必须尝试反序列化,假设它已经正确并在catch块上处理它?<​​/ p>

我希望我能说清楚,我期待着提出建议。

干杯

Paulo Almeida

2 个答案:

答案 0 :(得分:1)

假设一个正确的REST服务,响应代码应该表明请求是否成功。在这种情况下,您可以根据不同的响应代码做出决定。

对于不正确实现的REST服务,您可能希望将响应数据反序列化为“弱”(映射)类型,如JsonObject(如果需要,可以进一步处理,具体取决于处理数据的内容)。 / p>

答案 1 :(得分:0)

我所做的是使用com.google.gson.JsonParser而不是尝试反序列化为对象。使用该接口,您可以检查顶级元素(可能检查特定属性),然后决定要执行的操作。