Как в json передать кавычки
Перейти к содержимому

Как в json передать кавычки

C #: Как я могу использовать скобки в кавычках в JSON?

Если это не существует, я автоматически генерирую это.

Например, это C # -Code, где я использую строку напрямую:

Теперь проблема в том, что строка не работает таким образом, потому что C # сделает кавычки буквальными и затем сохранит их в string s , что приведет к

Которая является ошибочной json-строкой, потому что кавычки не экранированы.

Превращение всей строки в буквальное приводит к тому же результату.

Я что-то упускаю?

5 ответов

\» добавляет экранированные кавычки, чтобы C # не заканчивал строку, но нарушал JSON. Чтобы экранировать кавычки в JSON, вам нужно добавить обратную косую черту \\ , и JSON должен быть:

Лучший способ создать правильный 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`.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *