JSON.stringify在屬性上沒有引號?
阿新 • • 發佈:2020-12-24
JSON.stringify在屬性上沒有引號?
https://qastack.cn/programming/11233498/json-stringify-without-quotes-on-properties
JSON.stringify在屬性上沒有引號?
95
我正在使用使用不正確的JSON格式的服務(屬性周圍沒有雙引號)。所以我需要傳送
{ name: "John Smith" }
代替{ "name": "John Smith" }
無法更改此格式,因為這不是我的服務。
有誰知道像上面這樣格式化JavaScript物件的字串化路由?
Answers:
115
在大多數情況下,此簡單的正則表示式解決方案可取消對JSON屬性名稱的引用:
const object = { name: 'John Smith' }; const json = JSON.stringify(object); // {"name":"John Smith"} console.log(json); const unquoted = json.replace(/"([^"]+)":/g, '$1:'); console.log(unquoted); // {name:"John Smith"}
執行程式碼段
展開摘要
極端情況:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
特別感謝Rob W修復了它。
侷限性
在正常情況下,上述正則表示式可以正常工作,但是從數學上講,不可能用正則表示式來描述JSON格式,以使其在每種情況下都可以工作(對於正則表示式,計數相同數量的花括號是不可能的。)通過本地函式正式解析JSON字串並重新序列化,建立一個新的函式以刪除引號:
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}