如何补全非标准JSON中非null/空字符串格式的空值使其可解析为对象
需求完全可实现,核心是对非标准原始字符串做预处理后再做解析
问题本质
你拿到的原始字符串不属于可直接解析的合法数据格式,存在两类通用解析器无法识别的语法问题:
- 所有键、值都缺失语法要求的定界引号,不符合JSON等通用数据格式的解析规则
- 空值没有合法占位符:一类是对象中间的键值对空值(冒号后直接跟逗号),一类是对象末尾的键值对空值(冒号后直接跟右大括号),这类无有效内容的字段是所有标准数据解析接口都会报错的
具体操作流程
不需要编写复杂的自定义拆分逻辑,靠固定规则的字符串替换,就能把脏数据洗成可正常操作的对象:
- 给所有空值补统一占位值
- 针对中间位置的空值:匹配所有「冒号后直接紧跟逗号」的片段,在冒号和逗号之间插入你需要的默认填充值
比如你需要把空值标记为缺失,就把这类空值替换成null占位 - 针对末尾位置的空值:匹配所有「冒号后直接紧跟右大括号」的片段,同样插入和上面一致的默认填充值
替换前后的效果参考:
原始片段:
CO:,OX:,SP:
处理后片段:CO:null,OX:null,SP:null - 针对中间位置的空值:匹配所有「冒号后直接紧跟逗号」的片段,在冒号和逗号之间插入你需要的默认填充值
- 把零散的单对象拼接结构补成合法数组结构
你的原始数据是多个独立对象直接拼接的,只需要保留相邻对象之间的逗号分隔符,再给整个字符串的最外侧套上数组的方括号,就变成了合法的数组片段。 - 补全键和值的定界引号,转成标准JSON格式
- 匹配所有冒号前面的固定命名键(包含英文字符、数字、下划线的连续片段),给键加上双引号
- 除了之前补的null占位值,其他所有值都加上双引号——这么做是因为站点编码
SKT_CD是带前导零的固定编码(比如01582030),如果直接按数字解析会自动丢弃前导零,统一存成字符串可以完全保留原始值的内容
这一步完成后,整个字符串就完全符合JSON语法要求,直接调用编程语言自带的JSON解析接口,就能得到可正常操作的对象结构。
可直接复用的参考实现(JavaScript)
// 读取到的原始脏数据 const rawInput = `{SKT_CD:01582030,SKT_DATE:2021/04/12,SKT_TIME:21,SO2:0,NO:0,NO2:0.002,NOX:0.003,CO:,OX:,NMHC:,CH4:,THC:,SPM:0.008,PM2_5:,SP:},{SKT_CD:01582030,SKT_DATE:2021/04/12,SKT_TIME:22,SO2:0,NO:0,NO2:0.002,NOX:0.002,CO:,OX:,NMHC:,CH4:,THC:,SPM:0.010,PM2_5:,SP:}`; // 第一步:补全两类空值 let processed = rawInput .replace(/:,/g, ":null,") // 补中间位置的空值 .replace(/:}/g, ":null}") // 补对象末尾的空值 .replace(/^/, "[") // 整体包成数组开头 .replace(/$/, "]"); // 整体包成数组结尾 // 第二步:给所有键加双引号 processed = processed.replace(/([{,]\s*)([A-Za-z0-9_]+):/g, '$1"$2":'); // 第三步:给所有非null的值加双引号,避免解析错误 processed = processed.replace(/:([^,}]+)/g, (match, value) => { const trimmedVal = value.trim(); return trimmedVal === "null" ? match : `:"${trimmedVal}"`; }); // 直接解析为可操作的对象数组 const cleanData = JSON.parse(processed);
实操注意点
- 后续如果需要调整空值的填充内容,不需要修改其他逻辑,只需要第一步替换时把
null换成你需要的默认值即可(比如空字符串、0、"无数据") - 这套规则完全适配你当前拿到的固定结构监测数据:所有键为固定命名、值内部不会出现逗号或特殊符号,不会出现匹配错位的问题
- 不要直接把原始字符串丢给JSON解析器,缺占位、缺引号的格式一定会触发语法报错,预处理是必须的前置步骤
内容的提问来源于stack exchange,提问作者Gajiu
相关产品推荐
相关产品推荐

