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: 已死
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
解释
-
单个对象的 JSON 字符串:
old_m
是一个包含单个对象的数组。JSON.parse
将其解析为一个数组,并可以通过索引访问对象属性。- 输出
oldArr[0].date
显示了正确的日期。
-
多个对象的 JSON 数组字符串:
old_m
包含两个对象的数组。- 同样,
JSON.parse
将其解析为一个数组,并可以访问每个对象的属性。 - 输出
oldArr[0].date
显示了第一个对象的日期。
-
错误的 JSON 字符串:
new_m
是一个不合法的 JSON 字符串,因为它缺少方括号[ ]
来表示数组。JSON.parse
会抛出异常,因此需要使用try...catch
块来捕获并处理错误。
总结
在使用 JSON.parse
时,确保 JSON 字符串是合法的。对于数组,必须用方括号 [ ]
包围。如果 JSON 字符串不合法,JSON.parse
会抛出异常,需要进行适当的错误处理。
这代码看起来好乱
哦 , 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);
解释
-
字符串格式问题:
- 在你的原始代码中,字符串格式不正确,例如:
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"}]';
- 在你的原始代码中,字符串格式不正确,例如:
-
访问数组中的元素:
- 当解析的是一个数组时,需要通过索引访问其中的元素,例如
oldArr[0].date
而不是oldArr.date
。
- 当解析的是一个数组时,需要通过索引访问其中的元素,例如
-
测试用例:
- 测试用例中的
new_m
和old_m
字符串都修正为正确的格式,并且使用数组格式。
- 测试用例中的
这样修改后,代码应该可以正常运行并输出预期结果。