Android 没法解析这样格式的错误消息吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tr0y
V2EX    Java

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

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

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

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

    其实我这样的错误格式是有目的的,前端的 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     Solana     2043 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:57 PVG 08:57 LAX 16:57 JFK 19:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86