json 返回多种对象 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EGOISTK21

json 返回多种对象

  •  
  •   EGOISTK21 2018 年 4 月 18 日 via iPhone 14239 次点击
    这是一个创建于 2928 天前的主题,其中的信息可能已经有所发展或是发生改变。

    毕设是一个游戏,后端用的 flask,前端是安卓。前端用 rxjava、retrofit 和 gson adapter 处理 json。

    目前遇到一个问题:有的 API 是消费金币的,比如点击之后会获得多种不同的商品(类似王者荣耀水晶抽奖),那么后端返回的 json 里的数据中怎么既包含商品数组又包含消费后的金币余额。不考虑余额的 json 大概是这样的

    json<br>{<br> “ code ” : 200<br> “ data ” : {<br> [{序列化后英雄对象}, {序列化后英雄碎片}, {序列化后体验卡}]<br> }<br> “ msg ” : null<br>}<br><br>

    现在的问题就是如何把余额也放到 data 这个数组里面,并且安卓前端能够顺利的按类型反序列化,我的初步想法是 data 里用键值对存对象类型和对象内容,但总觉得不优雅,苦于 Google 不到相关问题,遂来 v 站问一下各位在职的前辈们,这种 API 业内是怎么实现的。

    7 条回复    2018-04-18 09:37:36 +08:00
    MeteorCat
        1
    MeteorCat  
       2018 年 4 月 18 日 via Android
    点击抽奖之后,你需要传递给服务端的是你做出了抽奖动作,之后服务端返回你中奖的道具 ID,你拿着道具 ID 去找你本地道具资源并且自行在你本地游戏端做扣除工作
    MeteorCat
        2
    MeteorCat  
       2018 年 4 月 18 日 via Android
    余额没必要放到数组里面,除非有那种折扣类型或者减免优惠的,否则你只需要拿到抽奖成功之后对应道具 ID 扣除自己本地游戏端余额
    MeteorCat
        3
    MeteorCat  
       2018 年 4 月 18 日 via Adroid   1
    如果你有实现外部发放道具机制(正式游戏都有运营管理后台给予道具弹出浮窗补发和邮件公告补发)的话,实际上你抽奖的流程其实是,你抽奖的行为发送给服务端,之后服务端来解决你抽出什么道具,并返回道具 ID (这个待定,因为有的游戏本地打包对应道具 ID+道具表信息,有的游戏确实是让服务端直接返回获取道具列表,我个人倾向打包本地资源,服务端只返回 ID 来节约发送字节数),服务器就是弹窗通知你获得什么道具,当到了这里就是有很多处理方法:1.如果是不变的,没有太大波动,直接游戏端扣除消耗的金额(参照手游很多 5、10、30 元固定额度充值加成); 2.包含变动因素的,客户端需要拿到服务端的最新金额数(首充 10 送 5 金币); 3.有抽奖获得角色信息变动的,成功之后自己请求自己的信息接口更新(抽奖获得头像立即使用更新自己头像)
    MonoLogueChi
        4
    MonoLogueChi  
       2018 年 4 月 18 日 via Android
    自己瞎扯了两种通信方式,以前我都是自己坐着玩的,所以不需要校验,我也不能保证我给的校验方式能不能实现
    方案 1
    客户端发出请求,询问商品种类和价格
    后端给出商品名称和价格,客户端加载出来
    客户端给出信息,并告诉后端买了什么东西,同时计算余额返回给后端
    后端查询价格,计算当前余额,确定余额信息正确,返回给客户端购买成功的信息
    客户端显示交易完成

    方案 2
    客户端发出请求,询问商品种类和价格
    后端给出商品名称和价格,客户端加载出来
    客户端根据购买产品计算余额,并将余额返回给后端
    后端收到后返回给客户端信息,余额已储存
    客户端显示交易完成

    我不知道你具体实现方式,后端是没有数据库的吗,如果有数据库的话应该是很容易实现的吧。如果是使用 JSON 文件代替数据库的话,余额这类和角色属性相关的东西,应该不会和物品写在一起吧
    EGOISTK21
        5
    EGOISTK21  
    OP
       2018 年 4 月 18 日 via iPhone
    @MeteorCat 听你的我放心在本地减了,原本担心数据不一致,现在想到如果有活动就返回非 200 状态码,要求请求活动优惠价格的 API 即可,如果是 200 那就直接本地扣除相应金额
    EGOISTK21
        6
    EGOISTK21  
    OP
       2018 年 4 月 18 日 via iPhone
    @MonoLogueChi 后端用的 mysql 数据库,你这种应该算是电商平台的交易流程吧,我的游戏想做的是尽量减少 API 请求
    ai277014717
        7
    ai277014717  
       2018 年 4 月 18 日
    放在 data 里正好啊。给数组起个名字而已 xxlist
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3760 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 04:25 PVG 12:25 LAX 21:25 JFK 00:25
    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