那些年遇到的后台返回的奇葩json数据

前言

开发多年,遇到的后台有很多,不同的人写的代码风格不一样,写出来的接口也不一样。下面就请求失败的接口举个例子,让大家看看有哪些奇葩的接口。反正我看的想打人了有木有?

1. 返回一片空白。

大哥,你这是要干啥呢。。。没有错误信息,我怎么知道请求成功还是失败。。这是在挑战我的智商吗?
(建议:下次遇到这样的,直接揍一顿,就说是我说的。下面这张图送给你们后台吧。)

image.png
2.key是数字,value也是数字,你当我是小学生呢?

如下所示:

{
  1:"123",
  2:"456",
  3:"789"
}
3.返回空字符串,大哥,你这是闹啥子。。
{
 "result":""
}
4.这个还看得过去,至少有个json数据返回。

然而:你给我返回的null什么意思。。。还不如不返回。。。这样设计有啥意义。。

{
 "data":"null"
}
5.比上面那个更可恶,有错误数据返回,有错误信息描述。

然而:错误数据返回null不说,错误信息居然返回一个一个url?就这么一点错误信息,还要我再去请求一次服务器获取这个错误信息吗。。
服务器流量不要钱的吧。。。经得起这样折腾?后台哥们啊,走点心吧!为老板省点流量钱吧,同时也要提高用户体验啊!用户请求网络的流量也不能由你这样去折腾。。

{
 "data":"null",
 "desc":"/error/desc" 
}
6. 返回url就算了,为什么加一个/转义字符?
{
  "error":"//error_desc"
}
7. 返回url就算了,居然还有返回中文的,用的是unicode转换的?我用的时候要把它转换回来。。很麻烦。。
{
  "error":"/%2F%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF"
} 
8. 返回的图片不是url,而是base64编码,我还要去用base64编码去处理。你是在逗我吗?让我看天文数字,给个url很难吗?
9. 还有的是全部是拼音的
{
  "cuowuma": 1,
  "cuowuxinxi":"请求失败"
}
10. 返回拼音也就算了,还有返回拼音缩写的

拼音缩写谁看得懂这是干啥用的?猜字谜吗???

11. 返回的json里面某些字段是java的关键字

问题:json里面某些字段是java的关键字,转成实体类的时候,会报错。

{
    "abstract": "Success",
    "id": "503",
    "package": "50"
}

转成实体类如下,会报错:

public class ResultEntity {
    private String abstract;
    private String id;
    private String package;
    //...get  set方法省略
}
  • 对老司机来说,这种小问题当然也是有解决办法的。使用google提供的序列化工具,按下面这样写,就可以正常的将数据反射到字段中了。
public class ResultEntity {
   @SerializedName("abstract")
    private String successInfo;
    private String id;
   @SerializedName("package")
    private String packageNumber;
    //...get  set方法省略
}
  • tips:按java编程规范来说,接口中是不能包含java关键字的。所以 奉劝各位后台新手不要心存侥幸心理,一切都要按规范来做,这样对你今后的开发会有很多帮助。
12. 返回的相同字段用的不同的数据类型,这个是最苦逼的,解析都不好处理。

比如下面这个,id字段,前面的是数字类型(我们这边暂定为int类型),最后一个是String类型,后台说是GUID,不管它是什么鬼,看到这种只想打人。万一哪天服务器把id都改成int类型了,客户端这边的代码中涉及到这个id字段的所有地方都要跟着改动,这不是坑爹吗。。。

[
  {
    "id": "503",
    "name": "License",
    "picture": "/userfiles/upload/2017/503.png"
  },
  {
    "id": "504",
    "name": "其它",
    "picture": "/userfiles/upload/2017/504.png"
  },
  {
    "id": "80896a88d8c3449bb90c4781ddbd4d49",
    "name": "TH inkaNet",
    "picture": "/userfiles/upload/2017/81211f2db0c649318e7166e447e91186.jpg"
  }
]
13. 多层嵌套的json,在中间的某一层后台返回的是null,这种情况解析起来很麻烦的。

举例说明:

{  
    "data": [  
        {  
            "id": "101",  
            "info": [  
                {  
                    "name": "张1",  
                    "code": "10101"  
                },  
                {  
                    "name": "张2",  
                    "code": "10102"  
                },  
                {  
                    "name": "张3",  
                    "code": "10103"  
                }
            ]  
        },  
        {  
            "id": "102",  
            "info": [  
                {  
                    "name": "张4",  
                    "code": "10201"  
                },  
                {  
                    "name": "张5",  
                    "code": "10202"  
                },  
                {  
                    "name": "张6",  
                    "code": null  
                }
            ]  
        },  
        {  
            "id": "104",  
            "info":null  
        }  
    ]  
}  

正确做法: 不管有没有数据返回,都要写清楚返回字段。

14. 有数据的时候返回的类型不统一,有数据的时候返回的是json array类型,没有数据返回的时候成了json object类型。

比如我遇到过的后台返回的数据举例如下:

有数据返回的时候:

{
    "id": "102",
    "info": [
        {
            "name": "张4",
            "code": "10201"
        },
        {
            "name": "张5",
            "code": "10202"
        },
        {
            "name": "张6",
            "code": null
        }
    ]
}

没有数据返回的时候,info这个json array类型怎么就变成了json object类型?莫名其妙:

{
    "id": "102",
    "info": {
        "name": "",
        "code": ""
    }
}

以下是正确做法,请广大 后台新手 get一下:
正确做法: 字段结构不能随意修改,不管有没有数据返回都不要随意修改,没有数据的就搞一些默认空值填上去。

15. 有时候遇到后台是新手,那就苦逼了,直接给你返回双引号里面包裹着json字符串,同时夹杂着\转义字符。

后台哥们说,你们客户端的自己去拆分解析吧。我看的想打人,你封装成一个对象,用[]返回不行吗?建议:看到这样的json,遇到后台哥们见一次打一次。只想甩他一张图。


请看下图。这是json格式化之后看到的效果,关键字涉及隐私,已打码处理。


下面来一个正确的示范:

这是一个很规范的接口设计,看着很舒服,处理起来很方便。(顺便说一句,推荐大家使用restful风格的接口)

{
  "errorCode": 1,
  "errorMsg": "请求失败",
  "data": {
     "message": "Problems parsing JSON"
  }
}

后记:

奉劝各位java新手 或者 混了几年的老油条,如果你写出的接口是以上这些,或者还有其他的奇葩接口,请好好的反思一下,不要有侥幸心理,认为独立开发或者小公司无所谓,有这种想法的人劝你先去面壁三分钟。
这里我总结一下规范的接口的意义所在。
  • 1.它是个人基础业务能力的一个展现。

同样3年java开发两个人,一个写的接口条理清晰,结构明确,一目了然;另外一个人写出了类似上面这类的接口。
很明显,前者给人的感觉是基础是比较扎实的。我个人理解,接口编写对于做后台的来说是家常便饭,它算是一门
基本功,就好比练武之人扎马步一个道理。后台跟前端或者客户端交互都要靠接口,接口写不好,还谈什么交互?
所以,能写出好的接口的人,至少有一点可以看出来,基础是比较扎实的。

  • 2.它是代码规范素养的一种体现。

接口写的好的人,可以推断这个人写代码应该也是比较规范的(虽然不能百分之百肯定,但至少它规范的要求自己写接口)。
假如有一天,你能去大公司,你要是写的很差的接口,我敢保证,你也在那里呆不长就被辞退,除非是不注重技术的所谓的大公司

  • 3.为后续接口维护节省了很多时间。

接口写不好的,后续加功能或者改接口,那就等着加班加点苦逼的去修改吧。同时也耽误了前端或者客户端的开发进度。

  • 4.规范的接口可以减少前后端人员为了一个字段在哪一端处理引发的不必要的争吵。

之前我就遇到过明明后台可以处理的比如base64编码,明明可以传一个url给客户端的,非要搞一个base64过来,叫你们自己去解码。后台哥们技术一般,代码又是老项目,它也很多搞不懂,跟他沟通无效,简直是浪费时间,没办法自己去处理吧。

所以 后台java 一定要严格按java编程规范来做,写出规范的接口给别人使用。他好你也好。
如果不清楚使用restful风格的接口的,可以看看这篇文章 深入理解什么是RESTful 接口
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266