JSON中同类数值字段的两种表示方案:哪种更符合设计规范?
JSON Payload格式设计方案对比与选型建议
需求说明
- 包含多个存储同类数值数据的字段(参考
items中的字段) items中的元素数量不固定:部分请求可能缺少某些字段,方案1中需将对应字段设为null表示不存在
两种设计方案
方案1:键值对对象结构
{ "name":"my_name", "id": 1234, "items" : { "number_of_pens": 2, "number_of_books": 3, "number_of_bags": 1 } }
说明:items是一个对象,每种物品对应独立字段,缺失字段需显式设为null。
方案2:数组嵌套对象结构
{ "name":"my_name", "id": 1234, "items": [ { "name" : "number_of_pens", "value": 2 }, { "name" : "number_of_books", "value": 3 }, { "name" : "number_of_bags", "value": 1 } ] }
说明:items是数组,每个元素是包含name(物品标识)和value(数值)的对象,仅存在的物品会被加入数组。
选型分析与设计原则参考
已评估维度回顾
- Schema变更:方案1新增物品类型需修改Schema,方案2无需变更Schema,仅需新增数组元素;但方案1的字段语义更明确,Schema校验更直接。
- 多语言/框架易用性:方案1可直接通过字段名取值(如
items.number_of_pens),Java、C#这类强类型语言能直接映射为实体类属性,使用更省心;方案2需要遍历数组匹配name字段才能取值,代码量更大。 - Payload大小:方案1冗余更少(不用重复写
name、value这些键),相同数据下传输体积更小,效率更高。
补充需考虑的维度
- 数据扩展性:如果未来要给单个物品加额外属性(比如单价、品牌),方案2只需在数组元素里加新字段即可;方案1得给每种物品新增对应属性(如
number_of_pens_price),会让对象结构越来越臃肿。 - 查询与过滤效率:如果经常要按物品类型筛选数据,方案1直接通过字段访问,速度更快;方案2得遍历数组匹配,数据量大时性能会受影响。
- 空值处理:方案1需要手动给缺失字段设
null,容易遗漏;方案2只要不添加对应数组元素就行,天然符合JSON“缺失即不存在”的语义,不用额外处理空值。 - 数据一致性:方案1的字段名是固定的,能避免拼写错误(比如把
number_of_pens写成num_of_pens);方案2的name是字符串,容易出现拼写不一致的问题,得额外做校验。
选型建议
- 如果物品类型相对固定,且不需要给单个物品加额外属性,优先选方案1:语义清晰、访问方便、传输高效,适配强类型语言的实体类映射。
- 如果物品类型会频繁新增,或未来要给物品扩展更多属性,优先选方案2:Schema稳定、扩展性强,天然适配动态变化的物品集合。
内容的提问来源于stack exchange,提问作者Deniz
相关产品推荐
相关产品推荐

