間違ったJSON形式を使用するサービスを使用しています(プロパティを二重引用符で囲んでいません)。だから私は送る必要があります
{ name: "John Smith" }
それ以外の{ "name": "John Smith" }
これは私のサービスではないため、この形式を変更することはできません。
上記のようなJavaScriptオブジェクトをフォーマットするためのstringifyルーティングを知っている人はいますか?
間違ったJSON形式を使用するサービスを使用しています(プロパティを二重引用符で囲んでいません)。だから私は送る必要があります
{ name: "John Smith" }
それ以外の{ "name": "John Smith" }
これは私のサービスではないため、この形式を変更することはできません。
上記のようなJavaScriptオブジェクトをフォーマットするためのstringifyルーティングを知っている人はいますか?
この単純な正規表現ソリューションは、ほとんどの場合、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" }'
それを修正してくれたRobWに特に感謝します。
通常、前述のregexpは機能しますが、数学的には、すべての場合に機能するように正規表現でJSON形式を記述することはできません(regexpでは同じ数の中括弧を数えることは不可能です)。ネイティブ関数を介して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}}`;
}
JSON形式を定義した人が作成したパーサーのソースコードを見ることができます。関数呼び出しを探します。これらは値を引用符で囲みます。キーは、326行目と338行目で引用されています。json2.js
quote
変更後にライブラリを含めないでください。代わりに、関連する(stringify
)部分のみを取得するか、少なくともJSON
他のものに置き換えてください。FAKEJSON
。
たとえば、次のようFAKEJSON
にのみ定義されたオブジェクト:http stringify
: //jsfiddle.net/PYudw/
JSONP で servive を使用してみてください。この形式を使用する場合に提供されていると思います。
それ以外の場合は、 が標準に準拠する理由を適切に説明した詳細なバグ レポートを提出してください。ソースの問題を排除する以外の解決策は、実際の解決策ではありません。
手早く修正するには、文字列を解析する前に正規表現にパイプします。
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
または、より構文解析が必要な場合は、既存の javascript JSON パーサー (このような) を調整しようとします。
@Derek朕會功夫このメソッドを共有してくれてありがとう。オブジェクトの配列の文字列化もサポートするコードを共有したいと思います。
export const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => {
// In case of an array we'll stringify all objects.
if (Array.isArray(obj_from_json)) {
return `[${
obj_from_json
.map(obj => `${stringifyObjectWithNoQuotesOnKeys(obj)}`)
.join(",")
}]` ;
}
// not an object, stringify using native function
if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null){
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
return `{${
Object
.keys(obj_from_json)
.map(key => `${key}:${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`)
.join(",")
}}`;
};
CSVJSON の JSON Beautifierには、キーの引用符を削除するオプションがあります。コードだけが必要な場合は、GitHub リポジトリからコピーできます。Douglas Crockford の JSON2を修正して、そのサポートを追加しました。