Android 没法解析这样格式的错误消息吗?

2015-11-05 13:53:28 +08:00
 Tr0y
{
"phone":"该手机号码已经被注册了",
"code":"短信验证码不正确",
"username":"用户名不能为空",
"password":"密码不能为空",
"password_confirm":"确认密码不能为空"
}


后端的 RESTful 接口返回给 App 的,说是里面的键不固定(不同的业务错误的键是不一样的),没法获取到错误消息,我说你不能迭代一下吗?那边也没具体说,只是说要后端改消息格式。


其实我这样的错误格式是有目的的,前端的 Angularjs 获取到错误的时候,如果是 phone 有错误,就可以直接在 phone 的表单上可以直接高亮显示或者做一些提示。

想问一下这种难道很难处理?
2764 次点击
所在节点    Java
14 条回复
gengrui
2015-11-05 14:33:11 +08:00
抛砖引玉, JsonObject 里面是有一个 HashMap 的,起码以我所知,除非事先知道有可能出现的 key ,否则没法取到 value 。

只能做: if(jsonObject.has("phone")){String errorMessage = jsonObject.getString("phone");}

希望有其他人提供其他办法。多多指教。
oott123
2015-11-05 14:34:39 +08:00
不难处理。

考虑方便处理和国际化问题,建议改成 [{name: "phone", should: "unique"}] 这种格式。
毕竟是一堆错误,用数组比较合适。
HentaiMew
2015-11-05 14:37:08 +08:00
好不专业啊…提供一个 code 区分错误不就行了 居然键都不同。。
如果是成功和错误两种情况键不同还可以理解,首先判断 http_status 即可。估计所有 stasu 都是 200 吧…
Tr0y
2015-11-05 14:42:59 +08:00
@HentaiMew

1. 即便用 code ,不也是不一样的 code 吗,跟不一样的键没有区别,其实我的 RESTful 接口是可以自定义 error 的格式的。
2. RESTful 是遵循 HTTP 协议的, 200 表示请求成功了,凡是发生错误都是使用不同的 HTTP STATUS 。
Tr0y
2015-11-05 14:47:33 +08:00
@oott123

因为错误消息是服务端返回的,国际化的错误消息也是在服务端来做 translate, 根据用户的资料设置,客户端的 user agent ,客户端的 ip 等几个条件自动处理,而且项目没有涉及到国外业务,所以这个是不需要考虑的。

错误消息可以用数组,也没问题,但好像如果前面用不同的键, Android 那边就很难处理,觉得很怪异。
cxe2v
2015-11-05 14:47:50 +08:00
@Tr0y 用 code 是这样的格式{code :“ 1 ”, Message:"错误消息"},
这样键是固定了的,只需要区分 code 是哪个值就知道错误是什么,像你上面写的,是连键都没确定的
Tr0y
2015-11-05 14:50:50 +08:00
@cxe2v 是的,就是这个问题,我这边可以改成这种格式。

只是想问这个问题,难道不能迭代出上面那种格式的数据,然后展示出来?
Tr0y
2015-11-05 14:52:38 +08:00
好吧,可能解析出那种格式很难,之前跟 Angularjs 和 iOS 做过项目,一直用这种格式,结贴吧。
HentaiMew
2015-11-05 15:14:15 +08:00
@Tr0y
code 错误不同的值是可以被枚举的,结构是固定的,但是不同的键是不可被枚举切结构不固定,是十分具有风险性的。
几乎没有服务端设计会出现这种情况,只能说服务端设计很糟糕。
有一种情况是可以让返回结构不相同,例如:

http_status:200
{list:[{...},{...}]}
http_status 非 200
{code : x, message : "xxx"}
这种情况下可以首先判断 http_status 再来对应解析相应结构,通常 RESTFul Client 都将对象的反序列化过程抽象掉了,根本无需关心返回中是否少了字段或者多了。

或者统一异常和成功结构,例如成功
{code : 0, message: "SUCCESS", data : {....}}
失败:
{code : 错误码, message: "错误消息", data : null }
peizh2006
2015-11-05 16:19:59 +08:00
这关 Android 什么事, google 下 json schema
tonyVex
2015-11-05 16:27:01 +08:00
zzzmode
2015-11-05 16:48:04 +08:00
既然是协议就应该双方都知道定义的数据格式和含义啊, key 都变了代码那有这么智能的就能知道是错误消息。。
a0000
2015-11-05 20:25:32 +08:00
可以处理,也不难,但是这么设计感觉很恶心,不知道是不是有啥高级用意
zhgg0
2015-11-05 20:28:13 +08:00
可以处理,像楼上说的,这种设计太恶心了。应该用 6 楼的格式,所有接口都统一

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/233822

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX