私は間違った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}}`;
}