JSON.stringify без кавычек на свойства?

Я использую службу, которая использует неправильный формат JSON (без двойных кавычек вокруг свойств). Поэтому мне нужно отправить

{ name: "John Smith" } вместо { "name": "John Smith" }

Этот формат не может быть изменен, поскольку это не моя служба.

Кто-нибудь знает строгую маршрутизацию для форматирования объекта JavaScript, как указано выше?

Ответ 1

var json = '{ "name": "John Smith" }';       //Let say you got this
json = json.replace(/\"([^(\")"]+)\":/g,"$1:");  //This will remove all the quotes
json;                                        //'{ 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/

Обратите внимание, что код написан на ES6 и может потребовать переноса или ручного перевода для старых браузеров.

Ответ 2

Похоже, что это простой метод Object toString, который вы ищете.

В Node.js это решается с использованием объекта util и вызова util.inspect(yourObject). Это даст вам все, что вы хотите. следуйте этой ссылке для получения дополнительных возможностей, включая глубину применения метода. http://nodejs.org/api/util.html#util_util_inspect_object_options

Итак, вы ищете, в основном, инспектор объектов, а не конвертер JSON. Формат JSON указывает, что все свойства должны быть заключены в двойные кавычки. Следовательно, конвертеры JSON не будут делать то, что вы хотите, поскольку это просто не формат JSON. Особенности здесь: https://developer.mozilla.org/en-US/docs/Using_native_JSON

Объект для строки или проверки - это то, что вам нужно, в зависимости от языка вашего сервера.

Ответ 3

Вы можете посмотреть исходный код json2.js парсер, созданный тем, кто определил формат JSON. Ищите quote вызовы функций: они окружают значение кавычками. Ключи цитируются в строках 326 и 338.

Не включайте библиотеку после изменения. Вместо этого возьмите только соответствующую (stringify) часть или, по крайней мере, замените JSON чем-то другим, например. FAKEJSON.

Например, объект FAKEJSON, который только определил stringify: http://jsfiddle.net/PYudw/

Ответ 4

Нашел хороший пакет NPM, чтобы сделать именно это:

https://www.npmjs.com/package/stringify-object

const stringify = require('stringify-object')

let prettyOutput = stringify(json);

Работает довольно хорошо.

Ответ 5

Попробуйте использовать servive с JSONP, я думаю, они предлагают его при использовании этого формата.

Else, напишите им подробный отчет об ошибке, включая хорошую аргументацию, почему он должен соответствовать стандарту. Любое другое решение, кроме устранения проблемы с источником, не является реальным решением.

Быстрое n-грязное исправление может состоять в том, чтобы передать строку через регулярное выражение перед его разбором:

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

Или вы пытаетесь настроить существующий парсер JSON Javascript (например этот), если вы хотите более синтаксический синтаксический анализ.

Ответ 6

Ваш унаследованный синтаксис должен быть легко съеден YAML, который является надмножеством JSON.

Попробуйте JavaScript-анализатор YAML и самосвал: http://nodeca.github.com/js-yaml/

Ответ 7

CSVJSON JSON Beautifier имеет возможность отбрасывать кавычки на клавишах. Если вам нужен только код, вы можете скопировать его из репо GitHub. я изменил Douglas Crockford JSON2, чтобы добавить поддержку для этого.

Ответ 8

@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(",")
            }}';
};

Ответ 9

var jsonString = JSON.stringify(YOUROBJECT);

var jsonObject = JSON.parse(jsonString);