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

json 返回多种对象

  •  
  •   EGOISTK21 · 2018-04-18 00:53:48 +08:00 via iPhone · 10511 次点击
    这是一个创建于 2440 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    我不知道你具体实现方式,后端是没有数据库的吗,如果有数据库的话应该是很容易实现的吧。如果是使用 JSON 文件代替数据库的话,余额这类和角色属性相关的东西,应该不会和物品写在一起吧
    EGOISTK21
        5
    EGOISTK21  
    OP
       2018-04-18 08:19:37 +08:00 via iPhone
    @MeteorCat 听你的我放心在本地减了,原本担心数据不一致,现在想到如果有活动就返回非 200 状态码,要求请求活动优惠价格的 API 即可,如果是 200 那就直接本地扣除相应金额
    EGOISTK21
        6
    EGOISTK21  
    OP
       2018-04-18 08:21:26 +08:00 via iPhone
    @MonoLogueChi 后端用的 mysql 数据库,你这种应该算是电商平台的交易流程吧,我的游戏想做的是尽量减少 API 请求
    ai277014717
        7
    ai277014717  
       2018-04-18 09:37:36 +08:00
    放在 data 里正好啊。给数组起个名字而已 xxlist
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.