117

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

{ name: "John Smith" }それ以外の{ "name": "John Smith" }

これは私のサービスではないため、この形式を変更することはできません。

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

4

10 に答える 10

145

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

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

于 2012-06-27T19:22:32.880 に答える
6

JSON形式を定義した人が作成したパーサーのソースコードを見ることができます。関数呼び出しを探します。これらは値を引用符で囲みます。キーは、326行目と338行目で引用されています。json2.js quote

変更後にライブラリを含めないでください。代わりに、関連する(stringify)部分のみを取得するか、少なくともJSON他のものに置き換えてください。FAKEJSON

たとえば、次のようFAKEJSONにのみ定義されたオブジェクト:http stringify: //jsfiddle.net/PYudw/

于 2012-06-27T19:31:15.437 に答える
3

JSONP で servive を使用してみてください。この形式を使用する場合に提供されていると思います。

それ以外の場合は、 が標準に準拠する理由を適切に説明した詳細なバグ レポートを提出してください。ソースの問題を排除する以外の解決策は、実際の解決策ではありません。

手早く修正するには、文字列を解析する前に正規表現にパイプします。

var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));

または、より構文解析が必要な場合は、既存の javascript JSON パーサー (このような) を調整しようとします。

于 2012-06-27T19:33:18.177 に答える
2

@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(",")
            }}`;
};
于 2019-04-08T18:43:15.483 に答える
1

CSVJSON の JSON Beautifierには、キーの引用符を削除するオプションがあります。コードだけが必要な場合は、GitHub リポジトリからコピーできます。Douglas Crockford の JSON2を修正して、そのサポートを追加しました。

于 2016-10-06T22:39:53.870 に答える