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);