V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tr0y
V2EX  ›  Java

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

  •  
  •   Tr0y · 2015-11-05 13:53:28 +08:00 · 2767 次点击
    这是一个创建于 3305 天前的主题,其中的信息可能已经有所发展或是发生改变。

    {
    "phone":"该手机号码已经被注册了",
    "code":"短信验证码不正确",
    "username":"用户名不能为空",
    "password":"密码不能为空",
    "password_confirm":"确认密码不能为空"
    }

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

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

    想问一下这种难道很难处理?

    14 条回复    2015-11-05 20:28:13 +08:00
    gengrui
        1
    gengrui  
       2015-11-05 14:33:11 +08:00   ❤️ 1
    抛砖引玉, JsonObject 里面是有一个 HashMap 的,起码以我所知,除非事先知道有可能出现的 key ,否则没法取到 value 。

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

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

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

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

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

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

    只是想问这个问题,难道不能迭代出上面那种格式的数据,然后展示出来?
    Tr0y
        8
    Tr0y  
    OP
       2015-11-05 14:52:38 +08:00
    好吧,可能解析出那种格式很难,之前跟 Angularjs 和 iOS 做过项目,一直用这种格式,结贴吧。
    HentaiMew
        9
    HentaiMew  
       2015-11-05 15:14:15 +08:00   ❤️ 1
    @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
        10
    peizh2006  
       2015-11-05 16:19:59 +08:00
    这关 Android 什么事, google 下 json schema
    tonyVex
        11
    tonyVex  
       2015-11-05 16:27:01 +08:00
    zzzmode
        12
    zzzmode  
       2015-11-05 16:48:04 +08:00
    既然是协议就应该双方都知道定义的数据格式和含义啊, key 都变了代码那有这么智能的就能知道是错误消息。。
    a0000
        13
    a0000  
       2015-11-05 20:25:32 +08:00 via Android
    可以处理,也不难,但是这么设计感觉很恶心,不知道是不是有啥高级用意
    zhgg0
        14
    zhgg0  
       2015-11-05 20:28:13 +08:00
    可以处理,像楼上说的,这种设计太恶心了。应该用 6 楼的格式,所有接口都统一
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5134 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 09:32 · PVG 17:32 · LAX 01:32 · JFK 04:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.