Android 解析从云端点返回的JSON错误(google app engine)

Android 解析从云端点返回的JSON错误(google app engine),android,google-app-engine,google-cloud-endpoints,Android,Google App Engine,Google Cloud Endpoints,在我的Endpoints API方法中,我有一行代码,如果用户已使用电子邮件地址,则会引发错误: 抛出新的BadRequestException(“电子邮件地址已被占用”) 在我的Android客户端中,我试图解析此错误,以便将其显示给用户: try { myApi.registerUser(registrationInput).execute(); } catch (IOException e) { String jsonEr

在我的Endpoints API方法中,我有一行代码,如果用户已使用电子邮件地址,则会引发错误:

抛出新的BadRequestException(“电子邮件地址已被占用”)

在我的Android客户端中,我试图解析此错误,以便将其显示给用户:

  try {
            myApi.registerUser(registrationInput).execute();
        } catch (IOException e) {
            String jsonError = e.getMessage();
            try {
                JSONObject  jsonRootObject = new JSONObject(jsonError);
                // myError should be "The Email address is already taken."
                String myError = jsonRootObject.optString("message").toString();

            }catch(Exception ex)
            {
                ex.printStackTrace(); 
            }
}
但是,我在Android Studio中遇到一个错误:

org.json.JSONException:java.lang.Integer类型的值400不能为空 转换为JSONObject

jsonError字符串的值如下:

400 Bad Request
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "The Email address is already taken.",
      "reason": "badRequest"
    }
  ],
  "message": "The Email address is already taken."
}
如您所见,我正在尝试获取错误的
消息

我认为问题在于返回的错误以
400错误请求开始,而不是一个空括号

问题:是否有正确的方法解析云端点错误以获取代码和消息,以便我可以将其显示给我的用户?

我在文档中看到一些Java代码,如下所示:

try {
  commitResponse = datastore.commit(commitRequest);
} catch (DatastoreException e) {
  int code = e.getCode();
  String method = e.getMethodName();
  JSONObject json = new JSONObject(new JSONTokener(e.getMessage()));
  JSONObject error = json.getJSONObject("error")
      .getJSONArray("errors")
      .getJSONObject(0);
  String reason = error.getString("reason");
  String message = error.getString("message");
  // ... process error ...
}
但我不认为这是Android的。我认为这是非android Java代码?不管怎么说,我无法正确地导入,甚至无法使其正常工作,但它可能提供了一个线索


谢谢你的帮助

端点引发的异常包含作为其消息接收的HTTP响应。因此,收到的响应基本上是一个标准,定义如下:第一行是响应的
状态行
,其余是可选的
消息体

尽管快速访问JSON消息体有点麻烦,但如果需要的话,这似乎是一种相对简单的授予开发人员访问完整HTTP响应的方法


正如@Dexter之前所建议的,从
getMessage()
的结果中删除第一行应该足以严格返回JSON消息体。如果您以后遇到其他标头导致此解析解决方案出现问题,您可以搜索HTTP标头的结尾,然后从那里解析JSON消息正文的
字符串的结尾。

您可以为JSON错误字符串创建自己的解析器。删除第一行,你就可以开始了。@Dexter是的,这就是我下一步要做的,但我想先问一下,因为这样做似乎太愚蠢了=(