JSON记录设计问题求助:解析记录集合遇长期困扰
解析这类JSON记录的痛点及解决方案
我完全理解你这种被不合理JSON设计卡很久的烦躁——把资源路径和版本信息硬塞在单个字符串的data字段里,确实会给解析带来一堆不必要的麻烦,尤其是还遇到像第二条记录那样截断的情况,简直雪上加霜。
先说说现有设计的核心问题
- 耦合性太强:资源路径和版本信息绑定在一个字符串里,要单独提取其中一项必须手动做字符串拆分,很容易因为格式不统一(比如截断、分隔符变化)出错。
- 缺少校验性:像第二条记录的版本字段明显不完整,机器无法自动识别这种错误,只能靠人工排查。
- 扩展性差:如果后续要新增其他参数(比如资源类型、作者),只能继续往这个字符串里加,只会让解析逻辑越来越复杂。
最优解:重构JSON结构(推荐)
如果有机会修改原始数据的生成逻辑,把data拆分成结构化的字段是一劳永逸的办法。比如改成这样:
[ { "resourcePath": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/article/test", "version": "1521246543034" }, { "resourcePath": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/book/test2", "version": null, "invalidReason": "版本字段截断" } ]
这样解析时直接提取对应字段就行,完全不用处理字符串拆分的问题,后续新增字段也方便。
临时方案:针对现有结构的解析代码
如果暂时没法修改原始结构,可以用字符串处理逻辑来兼容,下面是JavaScript的示例(其他语言思路类似):
const rawJson = [ { "data": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/article/test;version=1521246543034" }, { "data": "/publication/a40a5e5c-98b3-45ae-d6a3-924b31d8712a/book/test2;versio" } ]; const parsedResults = rawJson.map(item => { let resourcePath = item.data; let version = null; let isVersionInvalid = false; // 先处理正常的版本分隔符 const versionSplit = item.data.split(";version="); if (versionSplit.length === 2) { resourcePath = versionSplit[0]; // 校验版本是否为有效数字(根据你的实际需求调整规则) if (/^\d+$/.test(versionSplit[1])) { version = versionSplit[1]; } else { isVersionInvalid = true; } } // 处理截断的版本字段(比如第二条记录的";versio") else if (item.data.includes(";versio")) { resourcePath = item.data.split(";versio")[0]; isVersionInvalid = true; } return { resourcePath, version, isVersionInvalid }; }); console.log(parsedResults);
这个代码会帮你拆分出资源路径和版本,同时标记版本无效的记录,避免解析出错。
内容的提问来源于stack exchange,提问作者App2015
相关产品推荐
相关产品推荐

