
本文讲解如何在 JavaScript 中正确解析对象内嵌的 JSON 字符串,并批量提取其中特定字段(如 serviceCode)的值,避免因未解码导致的 undefined 错误。
本文讲解如何在 javascript 中正确解析对象内嵌的 json 字符串,并批量提取其中特定字段(如 `servicecode`)的值,避免因未解码导致的 `undefined` 错误。
在实际开发中,我们常会遇到类似这样的数据结构:一个对象(如 x),其属性值并非原始对象,而是序列化后的 JSON 字符串。直接尝试访问 value.serviceCode 会失败,因为字符串不具备对象属性访问能力——必须先通过 JSON.parse() 将其反序列化为 JavaScript 对象。
以问题中的数据为例,x 是一个类数组对象(键为 "0"、"1"、"2"),每个值都是完整 JSON 字符串。原代码中调用 arr.push(value) 后得到的是字符串数组,而 arr.carrierCode 试图访问数组的 carrierCode 属性(而非数组元素的属性),自然返回 undefined;更关键的是,即使遍历 arr,若不解析字符串,也无法读取 serviceCode。
✅ 正确做法是:在遍历过程中对每个字符串执行 JSON.parse(),再安全提取目标字段:
const x = {
"0": "{\"carrierCode\":\"ups\",\"serviceCode\":\"ups_ground\",...}",
"1": "{\"carrierCode\":\"ups\",\"serviceCode\":\"ups_second_day_air\",...}",
"2": "{\"carrierCode\":\"ups\",\"serviceCode\":\"ups_next_day_air\",...}"
};
// 使用 Object.values() 更简洁(推荐,无需 jQuery)
const serviceCodes = Object.values(x).map(jsonStr => {
try {
const obj = JSON.parse(jsonStr);
return obj.serviceCode;
} catch (e) {
console.warn("Invalid JSON string skipped:", jsonStr, e);
return null; // 或抛出错误、跳过等策略
}
});
console.log(serviceCodes);
// 输出: ["ups_ground", "ups_second_day_air", "ups_next_day_air"]
? 注意事项:
- ❗ 必须使用
JSON.parse()解析字符串,否则无法访问嵌套属性; - ⚠️ 建议添加
try...catch处理可能的解析异常(如格式错误、空字符串),提升健壮性; - ? 避免使用
Object.create(x)创建新对象——它仅设置原型链,并不改变x的可枚举性,且在此场景中无实际作用; - ✅ 现代写法优先选用原生
Object.values()+map(),替代依赖 jQuery 的$.each(),减少外部库耦合; - ? 若需提取多个字段(如
serviceCode和totalAmount),可在map回调中返回对象:{ serviceCode: obj.serviceCode, totalAmount: obj.totalAmount }。
总结:处理“字符串化的对象集合”时,核心原则是 先解析,后访问。牢记 JSON 字符串 ≠ JS 对象,一步解析不可省略。











