parse
Để có thể chuyển chuỗi JSON sang object, ta sử dụng phương thức parse() của lớp đối tượng JSON.
Cú pháp như sau:
// json is mandatory
// reviver is an optional callback function
JSON.parse(json, reviver)Ví dụ:
const usersText = `{
"users":[
{
"firstName":"Asabeneh",
"lastName":"Yetayeh",
"age":250,
"email":"asab@asb.com"
},
{
"firstName":"Alex",
"lastName":"James",
"age":25,
"email":"alex@alex.com"
},
{
"firstName":"Lidiya",
"lastName":"Tekle",
"age":28,
"email":"lidiya@lidiya.com"
}
]
}`
const usersObj = JSON.parse(usersText)
console.log(usersObj) // {users: Array(3)}reviver
Trong số các tham số của parse có một tham số gọi là reviver. Tham số này là một callback, thường dùng để format dữ liệu.
Tham số của reviver là:
keylà thuộc tính muốn format.valuelà giá trị của thuộc tính đó.
Note
Tham số
keyvàvaluesẽ nhận vào cặp key-value của mọi đối tượng có trong JSON.
Chẳng hạn ta muốn viết hoa firstName và lastName:
const usersText = `{
"users":[
{
"firstName":"Asabeneh",
"lastName":"Yetayeh",
"age":250,
"email":"asab@asb.com"
},
{
"firstName":"Alex",
"lastName":"James",
"age":25,
"email":"alex@alex.com"
},
{
"firstName":"Lidiya",
"lastName":"Tekle",
"age":28,
"email":"lidiya@lidiya.com"
}
]
}`
const usersObj = JSON.parse(usersText, function (key, value) {
let newValue = typeof value == "string" && key != "email" ? value.toUpperCase() : value
return newValue
})
console.log(usersObj.users[0]) // {firstName: 'ASABENEH', lastName: 'YETAYEH', age: 250, email: 'asab@asb.com'}Attention
Nếu
revivertrả vềundefinedthì thuộc tính đang xét sẽ bị xóa khỏi object.
Ví dụ:
const jsonObject = JSON.parse('{"1": 1, "2": 2, "3": 3, "4": 4, "5": 5}', (key, value) => {
if (value != 5) return value
})
console.log(jsonObject) // {1: 1, 2: 2, 3: 3, 4: 4}Áp dụng đối với mảng:
const jsonObject = JSON.parse("[1, 2, 3, 4, 5]", (key, value) => {
if (value !== 5) return value
})
console.log(jsonObject) // [1, 2, 3, 4, undefined]Warning
Lưu ý rằng, callback sẽ được gọi thêm một lần sau khi duyệt qua tất cả các giá trị. Ở lần gọi này, giá trị của
valuesẽ là kết quả sau khi chỉnh sửa bởireviver.Do đó, nếu trả về
undefinedở lần gọi này thì giá trị củaparsecũng sẽ làundefined.
Cụ thể như sau:
const jsonObject = JSON.parse("[1, 2, 3, 4, 5]", (key, value) => {
console.log(value) // 1 2 3 4 5 [1, 2, 3, 4, undefined]
if (value < 5) return value
})
console.log(jsonObject) // undefinedỞ lần lặp cuối trong ví dụ trên, giá trị của value là mảng [1, 2, 3, 4, undefined], khi so sánh với 5 thì sẽ cho ra kết quả là false:
console.log([1, 2, 3, 4, undefined] < 5) // falseDo đó, câu lệnh return value sẽ không được thực thi, dẫn đến, hàm parse không trả về giá trị gì cả. Kết quả, biến jsonObject có giá trị là undefined.
Important
Khi gặp một key, hàm
parsesẽ xét giá trị của key đó có phải là object không. Nếu phải, key đó sẽ không được xử lý bằngreviverngay lập tức mà thay vào đó sẽ xét tiếp vào các object con lồng ở bên trong.
Xét ví dụ sau:
JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', (key, value) => {
console.log(key) // 1 2 4 6 5 3 ""
return value
})