C #: Как я могу использовать скобки в кавычках в JSON?
Если это не существует, я автоматически генерирую это.
Например, это C # -Code, где я использую строку напрямую:
Теперь проблема в том, что строка не работает таким образом, потому что C # сделает кавычки буквальными и затем сохранит их в string s , что приведет к
Которая является ошибочной json-строкой, потому что кавычки не экранированы.
Превращение всей строки в буквальное приводит к тому же результату.
Я что-то упускаю?
5 ответов
\»
Лучший способ создать правильный JSON — это сериализовать анонимные объекты (если у вас нет подходящих моделей).
ПРИМЕЧАНИЕ. Вы также можете использовать строку Verbatim.
С дословными строками косая черта, просто косая черта и не является escape-символом. Чтобы вставить цитату, используйте двойные двойные кавычки ( «» ). Также сохраняются переводы строки, что позволяет легко создавать многострочные строки без некоторой комбинации возврата каретки ( \r ) и перевода строки ( \n ). Их можно часто легче читать — обратите внимание на последовательность из 4 двойных кавычек в конце строки.
Если вы хотите создать файл Json, первым делом вы должны использовать сериализацию объекта. Это избавит вас от необходимости экранировать символ в строковой переменной.
Для дословной строки начинайте с ожидаемой строки: «TestString»: «This is a \»
И добавляйте DQuote перед каждым DQuote => «»TestString»»:»»This is a \»»
Для простой строки вы должны экранировать каждый специальный символ с помощью \ .
«TestString»: «This is a \»
=> \»TestString\»:\»This is a \\\»
Проблема в том, что кавычки вокруг
\ «Используется C # для экранирования кавычек, а также JSON. Это означает, что:
Если вы поместите этот действительный текст JSON в файл:
И читать это так:
Тогда это будет аналогично вводу текста в строку, например, так:
И оба дадут вам вывод
Если я правильно понял ваш вопрос, вы просто хотите добавить специальный символ в строку JSON. Просто добавьте их так:
Формат JSON, метод toJSON
Допустим, у нас есть сложный объект, и мы хотели бы преобразовать его в строку, чтобы отправить по сети или просто вывести для логирования.
Естественно, такая строка должна включать в себя все важные свойства.
Мы могли бы реализовать преобразование следующим образом:
…Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого toString каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нём, но что, если объект сложный, и в его свойствах имеются вложенные объекты? Мы должны были бы осуществить их преобразование тоже.
К счастью, нет необходимости писать код для обработки всего этого. У задачи есть простое решение.
JSON.stringify
JSON (JavaScript Object Notation) – это общий формат для представления значений и объектов. Его описание задокументировано в стандарте RFC 4627. Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке.
JavaScript предоставляет методы:
- JSON.stringify для преобразования объектов в JSON.
- JSON.parse для преобразования JSON обратно в объект.
Например, здесь мы преобразуем через JSON.stringify данные студента:
Метод JSON.stringify(student) берёт объект и преобразует его в строку.
Полученная строка json называется JSON-форматированным или сериализованным объектом. Мы можем отправить его по сети или поместить в обычное хранилище данных.
Обратите внимание, что объект в формате JSON имеет несколько важных отличий от объектного литерала:
- Строки используют двойные кавычки. Никаких одинарных кавычек или обратных кавычек в JSON. Так ‘John’ становится "John" .
- Имена свойств объекта также заключаются в двойные кавычки. Это обязательно. Так age:30 становится "age":30 .
JSON.stringify может быть применён и к примитивам.
JSON поддерживает следующие типы данных:
- Объекты
- Массивы [ . ]
- Примитивы:
- строки,
- числа,
- логические значения true/false ,
- null .
JSON является независимой от языка спецификацией для данных, поэтому JSON.stringify пропускает некоторые специфические свойства объектов JavaScript.
- Свойства-функции (методы).
- Символьные ключи и значения.
- Свойства, содержащие undefined .
Обычно это нормально. Если это не то, чего мы хотим, то скоро мы увидим, как можно настроить этот процесс.
Самое замечательное, что вложенные объекты поддерживаются и конвертируются автоматически.
Важное ограничение: не должно быть циклических ссылок.
Здесь преобразование завершается неудачно из-за циклической ссылки: room.occupiedBy ссылается на meetup , и meetup.place ссылается на room :
Исключаем и преобразуем: replacer
Полный синтаксис JSON.stringify :
В большинстве случаев JSON.stringify используется только с первым аргументом. Но если нам нужно настроить процесс замены, например, отфильтровать циклические ссылки, то можно использовать второй аргумент JSON.stringify .
Если мы передадим ему массив свойств, будут закодированы только эти свойства.
Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что внутри participants – пустые объекты, потому что name нет в списке.
Давайте включим в список все свойства, кроме room.occupiedBy , из-за которого появляется цикличная ссылка:
Теперь всё, кроме occupiedBy , сериализовано. Но список свойств довольно длинный.
К счастью, в качестве replacer мы можем использовать функцию, а не массив.
Функция будет вызываться для каждой пары (key, value) , и она должна возвращать заменённое значение, которое будет использоваться вместо исходного. Или undefined , чтобы пропустить значение.
В нашем случае мы можем вернуть value «как есть» для всего, кроме occupiedBy . Чтобы игнорировать occupiedBy , код ниже возвращает undefined :
Обратите внимание, что функция replacer получает каждую пару ключ/значение, включая вложенные объекты и элементы массива. И она применяется рекурсивно. Значение this внутри replacer – это объект, который содержит текущее свойство.
Первый вызов – особенный. Ему передаётся специальный «объект-обёртка»: <"": meetup>. Другими словами, первая (key, value) пара имеет пустой ключ, а значением является целевой объект в общем. Вот почему первая строка из примера выше будет ":[object Object]" .
Идея состоит в том, чтобы дать как можно больше возможностей replacer – у него есть возможность проанализировать и заменить/пропустить даже весь объект целиком, если это необходимо.
Форматирование: space
Третий аргумент в JSON.stringify(value, replacer, space) – это количество пробелов, используемых для удобного форматирования.
Ранее все JSON-форматированные объекты не имели отступов и лишних пробелов. Это нормально, если мы хотим отправить объект по сети. Аргумент space используется исключительно для вывода в удобочитаемом виде.
Ниже space = 2 указывает JavaScript отображать вложенные объекты в несколько строк с отступом в 2 пробела внутри объекта:
Третьим аргументом также может быть строка. В этом случае строка будет использоваться для отступа вместо ряда пробелов.
Параметр space применяется исключительно для логирования и красивого вывода.
Пользовательский «toJSON»
Как и toString для преобразования строк, объект может предоставлять метод toJSON для преобразования в JSON. JSON.stringify автоматически вызывает его, если он есть.
Как видим, date (1) стал строкой. Это потому, что все объекты типа Date имеют встроенный метод toJSON , который возвращает такую строку.
Теперь давайте добавим собственную реализацию метода toJSON в наш объект room (2) :
Как в json передать кавычки
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Формат JSON, метод toJSON
В этой главе мы рассмотрим работу с форматом JSON, который используется для представления объектов в виде строки.
Это один из наиболее удобных форматов данных при взаимодействии с JavaScript. Если нужно с сервера взять объект с данными и передать его клиенту, то в качестве промежуточного формата — для передачи по сети, почти всегда используют именно его.
В современных браузерах есть замечательные методы, знание тонкостей которых делает операции с JSON простыми и комфортными.
Данные в формате JSON (RFC 4627) представляют собой:
- JavaScript-объекты < . >или
- Массивы [ . ] или
- Значения одного из типов:
- строки в двойных кавычках,
- число,
- логическое значение true / false ,
- null .
Почти все языки программирования имеют библиотеки для преобразования объектов в формат JSON.
Основные методы для работы с JSON в JavaScript — это:
- JSON.parse — читает объекты из строки в формате JSON.
- JSON.stringify — превращает объекты в строку в формате JSON, используется, когда нужно из JavaScript передать данные по сети.
Вызов JSON.parse(str) превратит строку с данными в формате JSON в JavaScript-объект/массив/значение.
Данные могут быть сколь угодно сложными, объекты и массивы могут включать в себя другие объекты и массивы. Главное, чтобы они соответствовали формату.
Умный разбор: JSON.parse(str, reviver)
Метод JSON.parse поддерживает и более сложные алгоритмы разбора.
Например, мы получили с сервера объект с данными события event .
Он выглядит так:
. И теперь нужно восстановить его, то есть превратить в JavaScript-объект.
Попробуем вызвать для этого JSON.parse :
Дело в том, что значением event.date является строка, а отнюдь не объект Date . Откуда методу JSON.parse знать, что нужно превратить строку именно в дату?
Для интеллектуального восстановления из строки у JSON.parse(str, reviver) есть второй параметр reviver , который является функцией function(key, value) .
Если она указана, то в процессе чтения объекта из строки JSON.parse передаёт ей по очереди все создаваемые пары ключ-значение и может возвратить либо преобразованное значение, либо undefined , если его нужно пропустить.
В данном случае мы можем создать правило, что ключ date всегда означает дату:
Кстати, эта возможность работает и для вложенных объектов тоже:
Сериализация, метод JSON.stringify
Метод JSON.stringify(value, replacer, space) преобразует («сериализует») значение в JSON-строку.
При сериализации объекта вызывается его метод toJSON .
Если такого метода нет — перечисляются его свойства, кроме функций.
Посмотрим это в примере посложнее:
Обратим внимание на два момента:
Дата превратилась в строку. Это не случайно: у всех дат есть встроенный метод toJSON . Его результат в данном случае — строка в таймзоне UTC.
У объекта room нет метода toJSON . Поэтому он сериализуется перечислением свойств.
Мы, конечно, могли бы добавить такой метод, тогда в итог попал бы его результат:
Попытаемся преобразовать в JSON объект, содержащий ссылку на DOM.
Произошла ошибка! В чём же дело? Неужели некоторые объекты запрещены? Как видно из текста ошибки — дело совсем в другом. Глобальный объект window — сложная структура с кучей встроенных свойств и круговыми ссылками, поэтому его преобразовать невозможно. Да и нужно ли?
Во втором параметре JSON.stringify(value, replacer) можно указать массив свойств, которые подлежат сериализации.
Для более сложных ситуаций вторым параметром можно передать функцию function(key, value) , которая возвращает сериализованное value либо undefined , если его не нужно включать в результат:
В примере выше функция пропустит свойство с названием window . Для остальных она просто возвращает значение, передавая его стандартному алгоритму. А могла бы и как-то обработать.
«`smart header То есть, если объект содержит вложенные объекты, массивы и т.п., то все они пройдут через `replacer`.