现有服务端返回的数据格式如下:
{
  "success": true,
  "data": [
    {
      "label": "高清频道",
      "id": 1,
      "expanded": false,
      "children": [
        {
          "label": "CCTV1 综合高清",
          "id": 1,
          "actionUrl": "/tv-show-detail/1",
          "imgUrl": "/cover/tv/1.jpg",
          "current": {
            "name": "瞬间中国",
            "time": "15:15-15:23"
          }
         },
        {
          "label": "CCTV2 财经高清",
          "id": 2,
          "actionUrl": "/tv-show-detail/2",
          "imgUrl": "/cover/tv/2.jpg",
          "current": {
            "name": "周末特供",
            "time": "15:20-15:42"
          }
         },
        {
          "label": "BTV6 体育高清",
          "id": 19,
          "actionUrl": "/tv-show-detail/19",
          "imgUrl": "/cover/tv/19.jpg",
          "current": false
         }
       ]
     }
   ]
}
children 字段里元素对应的类的定义为(使用的 Retrofit 和 Gson ):
public class Channel {
    @SerializedName("label")
    private String label;
    @SerializedName("id")
    private int id;
    @SerializedName("actionUrl")
    private String actionUrl;
    @SerializedName("imgUrl")
    private String imgUrl;
    @SerializedName("current")
    private CurrentShow current;
    ......
而 CurrentShow 是我定义的用来解析 current 字段的:
public class CurrentShow {
    private String name;
    private String time;
    private boolean empty;
    ...
现在的问题是,如果 current 字段为空的话值是 false,否则是 name 和 time 字段,所以上面这个 CurrentShow 用来处理 current 字段是有问题的。这个应该怎么处理呢?
     1 
                    
                    MonoLogueChi      2019-04-28 23:52:45 +08:00 via Android 
                    
                    把 false 当作 null 来处理?只是我猜的 
                 | 
            
     2 
                    
                    erichuang1994      2019-04-28 23:55:42 +08:00 
                    
                    
                 | 
            
     3 
                    
                    AngryMagikarp      2019-04-28 23:57:53 +08:00 
                    
                    你们这个接口数据不规范。current 怎么可以同时是两种数据类型,在这里既有可能是 Object,也可能是 boolean。这是不规范的做法。 
                如果是 Object,那么它的空值就是 null,不是 false。 如果确实需要一个 boolean 字段,应该和 current 分开,再加一个字段。  | 
            
     4 
                    
                    AngryMagikarp      2019-04-28 23:59:35 +08:00 
                    
                    这种格式不仅是 GSON,大部分语言的 JSON 解析库都会错。 
                 | 
            
     5 
                    
                    maninfog      2019-04-29 00:02:08 +08:00 via iPhone 
                    
                    我猜你们的后台是 php ? 
                 | 
            
     6 
                    
                    Nitroethane   OP @AngryMagikarp 接口数据是不规范... 
                @maninfog 我是给一个 Web 应用做一个 Android 客户端,算是个人项目,不是公司项目。后台不知道用啥写的...... @MonoLogueChi 刚开始的想法是打算当作 null 处理,但不知道咋操作...  | 
            
     7 
                    
                    AngryMagikarp      2019-04-29 00:12:34 +08:00 
                    
                    
                 | 
            
     8 
                    
                    MonoLogueChi      2019-04-29 00:26:09 +08:00 via Android 
                    
                    @Nitroethane Java 我不太懂,反正我知道某些库在解析失败的时候可能会是 null,但是不推荐这样做,如果是 C#的话我知道应该怎么做 
                 | 
            
     9 
                    
                    helloworld000      2019-04-29 01:05:43 +08:00 
                    
                    为什么不用 protobuf ? 
                 | 
            
     10 
                    
                    kevinlm      2019-04-29 04:40:40 +08:00 via iPhone 
                    
                    jsonobject 类型判断吧。一般这样的,确实只有 php 能干的出来,简直就是业界毒瘤 
                 | 
            
     11 
                    
                    alphatoad      2019-04-29 05:04:17 +08:00 via iPhone 
                    
                    Protobuf,请 
                 | 
            
     12 
                    
                    MoHen9      2019-04-29 08:31:28 +08:00 via Android 
                    
                    自定义解析器,你到网上随便搜一下就有 
                PHP 可能自动隐式转换了  | 
            
     13 
                    
                    ragnaroks      2019-04-29 08:36:06 +08:00 
                    
                    php 天下第一! 
                什么,你要我和 php 后端对接?溜了溜了  | 
            
     14 
                    
                    Jrue0011      2019-04-29 09:15:20 +08:00 
                    
                    GSON 应该可以单独为这个字段自定义一个处理器? 
                 | 
            
     15 
                    
                    abbenyyy      2019-04-29 09:50:55 +08:00 
                    
                    后端是真毒瘤,特别是这段时间培训班出来的 Java 也喜欢这么干。提个不太优雅的 Android 端处理方案吧,current 用 object 解析,之后要用到 current 的时候再强转。 
                 | 
            
     16 
                    
                    TommyLemon      2019-04-29 09:56:44 +08:00 
                    
                    类型不稳定是接口大忌,要么你说服后端改,要么自己兼容, 
                简单的方法是 current 类型定义为兼容两者的 Object,然后 if (current instanceof JsonObject) { JsonObject cur = (JsonObject) current; ... } else if (current instanceof Boolean) { Boolean cur = (Boolean) current; ... } else { ... }  | 
            
     17 
                    
                    TommyLemon      2019-04-29 09:58:25 +08:00 
                    
                    
                 | 
            
     18 
                    
                    gaius      2019-04-29 10:00:24 +08:00 
                    
                    全替换成 null 省事 
                 | 
            
     19 
                    
                    rookiewhy      2019-04-29 10:13:12 +08:00 
                    
                    php 吧,现在的后端就是 php,经常会有这种问题,我都是给坚持 json 数据应该按照规范来。 
                 | 
            
     20 
                    
                    CononYc      2019-04-29 10:53:18 +08:00 
                    
                    把 current 换成 object 类型把,然后循环的时候再去判断 current 的类型是不是布尔类型,做对应的处理 
                 | 
            
     21 
                    
                    TommyLemon      2019-04-29 11:02:41 +08:00 
                    
                    @CononYc 对的,我在 #16 楼也说了,还提供了代码 
                 | 
            
     22 
                    
                    LemonCoo1      2019-04-29 11:18:27 +08:00 
                    
                    @abbenyyy  java 想这么写还挺难的吧,都是定义好的类型怎么又是 boolean 又是 object,除非你直接用 jsonobject、map 啥的 
                 | 
            
     23 
                    
                    TommyLemon      2019-04-29 14:34:54 +08:00 
                    
                    @LemonCoo1 是的,静态类型定义好就不好改了,这个约束对前端是很利好的,如果还会变,只能说后端故意的。 
                APIJSON 很好地解决了类型不稳定等 前后端接口的 沟通、文档、联调 10 大痛点哦。 ![]() Node.ts, Python, PHP, Java, C#, Go 等多种语言后端实现,Android, iOS, JavaScript 等多端的 Demo, 还有各种文档、视频教程、在线工具等。 创作不易,GitHub 右上角点 Star 支持下吧 ^_^ https://github.com/TommyLemon/APIJSON/wiki  | 
            
     24 
                    
                    TommyLemon      2019-04-29 14:36:13 +08:00 
                    
                    
                 | 
            
     25 
                    
                    TommyLemon      2019-04-29 14:36:40 +08:00 
                    
                    @TommyLemon #23 楼给了很好的解决方案哦 
                 | 
            
     26 
                    
                    RockOrRoll      2019-04-30 08:39:52 +08:00 via Android 
                    
                    @TommyLemon 消停点吧 
                 |