プロパティに引用符を付けずに JSON.stringify を実行できますか? 質問する

プロパティに引用符を付けずに JSON.stringify を実行できますか? 質問する

私は間違ったJSON形式(プロパティを二重引用符で囲んでいない)を使用するサービスを使用しています。そのため、送信する必要があります

{ name: "John Smith" }の代わりに{ "name": "John Smith" }

これは私のサービスではないので、この形式は変更できません。

上記のような JavaScript オブジェクトをフォーマットするための stringify ルーティングを知っている人はいますか?

ベストアンサー1

この単純な正規表現ソリューションは、ほとんどの場合、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/

おすすめ記事