1. 程式人生 > 其它 >JSON.stringify在屬性上沒有引號?

JSON.stringify在屬性上沒有引號?

JSON.stringify在屬性上沒有引號?

https://qastack.cn/programming/11233498/json-stringify-without-quotes-on-properties

JSON.stringify在屬性上沒有引號?


95

我正在使用使用不正確的JSON格式的服務(屬性周圍沒有雙引號)。所以我需要傳送

{ name: "John Smith" }代替{ "name": "John Smith" }

無法更改此格式,因為這不是我的服務。

有誰知道像上面這樣格式化JavaScript物件的字串化路由?

javascriptjson

傑登特
source

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}}`;
}

示例:https//jsfiddle.net/DerekL/mssybp3k/