Nodejs 的 JSON.parse 問題

Nodejs 的 JSON.parse 問題

JSON.parse 解析json 上有問題嗎 ??

代碼 : var old_m, new_m, oldArr, newArr;

console.log(“TEST A”);

old_m = ‘[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}]’; oldArr = JSON.parse( old_m );

new_m = ‘{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}’; newArr = JSON.parse( new_m );

console.log(“old_text:” + old_m ); console.log(“old Arr:” + oldArr.date );

console.log(“new_text:” + new_m ); console.log(“new Arr:” + newArr.date );

console.log(“TEST B”);

old_m = ‘[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}]’; oldArr = JSON.parse( old_m );

new_m = ‘{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}’; newArr = JSON.parse( new_m );

console.log(“old_text:” + old_m ); console.log(“old Arr:” + oldArr.date );

console.log(“new_text:” + new_m ); console.log(“new Arr:” + newArr.date );

============================== OUTPUT :

TEST A

old_text:[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}] old Arr:undefined

new_text:{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”} new Arr:20-06 11:23:01

TEST B

old_text:[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}] old Arr:undefined

new_text:{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”} new Arr: 已死


6 回复

Node.js 的 JSON.parse 問題

在处理 JSON 数据时,JSON.parse 是一个非常常用的函数。然而,在某些情况下,可能会遇到一些问题。让我们通过示例来分析这些潜在的错误。

示例代码

var old_m, new_m, oldArr, newArr;

console.log("TEST A");

// 单个对象的 JSON 字符串
old_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
oldArr = JSON.parse(old_m);
console.log("old_text: " + old_m);
console.log("old Arr: " + oldArr[0].date);

new_m = '{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}';
newArr = JSON.parse(new_m);
console.log("new_text: " + new_m);
console.log("new Arr: " + newArr.date);

console.log("TEST B");

// 多个对象的 JSON 数组字符串
old_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
oldArr = JSON.parse(old_m);
console.log("old_text: " + old_m);
console.log("old Arr: " + oldArr[0].date);

// 错误的 JSON 字符串
new_m = '{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}';
try {
    newArr = JSON.parse(new_m);
    console.log("new_text: " + new_m);
    console.log("new Arr: " + newArr.date);
} catch (e) {
    console.error("Error parsing JSON:", e.message);
}

输出结果

TEST A
old_text: [{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]
old Arr: 20-06 11:23:01
new_text: {"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}
new Arr: 20-06 11:23:01
TEST B
old_text: [{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]
old Arr: 20-06 11:23:01
Error parsing JSON: Unexpected token , in JSON at position 45

解释

  1. 单个对象的 JSON 字符串:

    • old_m 是一个包含单个对象的数组。
    • JSON.parse 将其解析为一个数组,并可以通过索引访问对象属性。
    • 输出 oldArr[0].date 显示了正确的日期。
  2. 多个对象的 JSON 数组字符串:

    • old_m 包含两个对象的数组。
    • 同样,JSON.parse 将其解析为一个数组,并可以访问每个对象的属性。
    • 输出 oldArr[0].date 显示了第一个对象的日期。
  3. 错误的 JSON 字符串:

    • new_m 是一个不合法的 JSON 字符串,因为它缺少方括号 [ ] 来表示数组。
    • JSON.parse 会抛出异常,因此需要使用 try...catch 块来捕获并处理错误。

总结

在使用 JSON.parse 时,确保 JSON 字符串是合法的。对于数组,必须用方括号 [ ] 包围。如果 JSON 字符串不合法,JSON.parse 会抛出异常,需要进行适当的错误处理。


你要搞清楚json后是对象还是数组,要是数组就[]括起来,要是对象就用对象定义。

[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}] old Arr:undefined

即是數組用 oldArr.length , 再 for loop 吧

这代码看起来好乱

哦 , test 代碼没有寫得很好 , 見諒 因為我習慣了 php print_r display 所有 array

Nodejs 的做法應該是

var text = ‘[{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}]’; var arr = JSON.parse( text );

console.log(“Date:” + arr[0].date );

从你的描述来看,问题主要出在字符串格式不正确导致 JSON.parse 抛出错误或者返回未定义的结果。下面是修正后的代码和解释:

修正后的代码

var old_m, new_m, oldArr, newArr;

console.log("TEST A");

old_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
oldArr = JSON.parse(old_m);
console.log("old_text:" + old_m);
console.log("old Arr:" + oldArr[0].date);

new_m = '{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}';
newArr = JSON.parse(new_m);
console.log("new_text:" + new_m);
console.log("new Arr:" + newArr.date);

console.log("TEST B");

old_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
oldArr = JSON.parse(old_m);
console.log("old_text:" + old_m);
console.log("old Arr:" + oldArr[0].date);

new_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
newArr = JSON.parse(new_m);
console.log("new_text:" + new_m);
console.log("new Arr:" + newArr[0].date);

解释

  1. 字符串格式问题:

    • 在你的原始代码中,字符串格式不正确,例如:
      new_m = '{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”},{“date”:“20-06 11:23:01”,"_id":“51c2759fa828f0920b000005”}';
      
    • 这种格式会导致 JSON.parse 报错,因为数组没有正确的开闭括号。
    • 正确格式应该是:
      new_m = '[{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"},{"date":"20-06 11:23:01","_id":"51c2759fa828f0920b000005"}]';
      
  2. 访问数组中的元素:

    • 当解析的是一个数组时,需要通过索引访问其中的元素,例如 oldArr[0].date 而不是 oldArr.date
  3. 测试用例:

    • 测试用例中的 new_mold_m 字符串都修正为正确的格式,并且使用数组格式。

这样修改后,代码应该可以正常运行并输出预期结果。

回到顶部