使用JSON定义数据接口的一种错误姿势

JSON接口设计误区
探讨了在前后端交互中,不当的JSON数据结构设计如何影响接口的可扩展性和可读性,以及正确的做法。

翻代码的时候,无意中看到有小伙伴为前端定义接口的时候,使用JSON的姿势不太正确。

方便起见,把问题简化一下:java要向前端传送一个List,List中的每个对象有两个字段:标的物名称和标的价格。

这个有问题的数据接口是这样定义的:

{
    "objectList": [
        {
            "P-12-20191219-001": "5000"
        },
        {
            "P-12-20191219-002": "10000"
        },
        {
            "P-24-20191219-001": "50000"
        }
    ]
}

他直接将标的物名称(objectName)当做key,把标的物价格(objectPrice)当做value传给了前端。

下面说一下这样做的问题。

1、接口丧失了可扩展性

如果我们按照正常的做法,将接口设计成这样的话:

{
    "objectList": [
        {
            "objectName": "P-12-20191219-001",
            "objectPrice": "5000"
        },
        {
            "objectName": "P-12-20191219-002",
            "objectPrice": "10000"
        },
        {
            "objectName": "P-24-20191219-001",
            "objectPrice": "50000"
        }
    ]
}

以后如果需要追加字段,可以随时随意加。只要原来的两个字段不做变动,那App不管旧版新版都可以正常使用,完全不受影响。

但是定义成 “objectName”:“objectPrice” 的话,怎么扩展,怎么兼容?

新旧版本两个接口同时维护,直到旧版被强更掉吗?除了给自己徒增麻烦以外没有任何好处。

2、可读性极差(不具备自说明性)

长期做这个项目的同事,看到前面的“P-期限-日期-编号”,一般都能马上反应出来这是啥。

但是后面的5000、10000、50000都尼玛是个啥?不看文档打死也不敢随便猜(话说,如果有文档的话……)。

参考引用中未提及火柴人动作数据的具体内容。火柴人动作数据通常可通过以下几种方式获取: ### 手动定义 如果火柴人跳舞动作较为简单,可以手动定义每个动作的数据。例如用字符来表示火柴人的不同姿势,以下是一个简单示例: ```python # 火柴人不同动作的数据 dance_actions = [ " O \n/|\\\n/ \\", # 站立姿势 " O \n/| \n/ \\", # 举起一只手的姿势 " O \n |\\\n/ \\", # 举起另一只手的姿势 " O \n | \n/ \\", # 跨开腿的姿势 ] ``` ### 从动画文件中提取 若火柴人跳舞动画已经制作好,可以从动画文件(如GIF、Sprite Sheet等)中提取动作数据。以Python的`Pillow`库处理GIF文件为例: ```python from PIL import Image def extract_frames(gif_path): frames = [] with Image.open(gif_path) as gif: for frame_num in range(0, gif.n_frames): gif.seek(frame_num) frame = gif.copy() frames.append(frame) return frames # 使用示例 gif_path = "stickman_dance.gif" frames = extract_frames(gif_path) ``` ### 从游戏引擎中导出 如果火柴人跳舞是在游戏引擎(如Unity、Cocos2d等)中制作的,可以通过游戏引擎提供的导出功能,将动作数据导出为特定格式(如JSON、CSV等)。 ### 模拟生成 可以使用算法模拟火柴人的动作,生成动作数据。例如,通过随机改变火柴人的关节角度来生成不同的动作: ```python import random def generate_random_action(): # 简单示例,随机生成火柴人的动作数据 head = " O " body = f"{random.choice(['/', '|', '\\'])} {random.choice(['/', '|', '\\'])}" legs = f"/{random.choice([' ', ' '])}\\" action = f"{head}\n{body}\n{legs}" return action # 生成10个随机动作 random_actions = [generate_random_action() for _ in range(10)] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值