Как записывать json в файл с переносом строки java

Обновлено: 05.07.2024

Я сгенерировал немного JSON и пытаюсь превратить его в объект в JavaScript. Я продолжаю получать ошибки. Вот что у меня есть:

Это дает мне ошибку:

Когда я вынимаю \n после sometext , ошибка исчезает в обоих случаях. Я не могу понять, почему \n делает eval и JSON.parse неудачными.

Я думаю, это то, что вы хотите:

(Вам нужно экранировать «\» в вашей строке (превратив его в двойное - «\»), иначе он станет новой строкой в источнике JSON, а не данными JSON.)

Вам понадобится функция, которая заменяет \n на \\n , если data не является строковым литералом.

В результате dataObj будет

Я использовал эту функцию для удаления новой строки или других символов в данных для анализа данных JSON:

Вы можете просто экранировать свою строку на сервере, когда записываете значение поля JSON, и удалять его при извлечении, например, в браузере клиента.

Реализация JavaScript всех основных браузеров имеет команду unescape.

Как я понимаю ваш вопрос, речь идет не о синтаксическом анализе JSON, потому что вы можете скопировать и вставить JSON напрямую в свой код - поэтому, если это так, просто скопируйте JSON напрямую в переменную dataObj , не заключая его в одинарные кавычки (совет: eval==evil )

Конвертирует приведенную выше строку в

Как упомянуто здесь

Эта функция добавляет двойные кавычки в начале и конце входной строки и экранирует специальные символы JSON. В частности, новая строка заменяется символом \ n, символ табуляции заменяется символом \ t, обратный слеш заменяется двумя обратными слешами \, а обратный слеш ставится перед каждой кавычкой.

Строка - это последовательность кодовых точек Unicode, заключенная в кавычки ( U+0022 ) . Все символы могут быть заключены в кавычки, кроме символы, которые должны быть экранированы: кавычка ( U+0022 ), обратный солидус ( U+005C ) и управляющие символы от U+0000 до U+001F . Есть двухсимвольный escape-представления последовательности некоторых символов.

Таким образом, вы не можете напрямую передавать 0x0A или 0x0C коды. Запрещено! В спецификации предлагается использовать escape-последовательности для некоторых четко определенных кодов от U+0000 до U+001F :

  • \f представляет символ перевода формы ( U+000C ).
  • \n представляет символ перевода строки ( U+000A ).

Поскольку большинство языков программирования использует \ для цитирования, вам следует избегать синтаксиса escape (double-escape - один раз для языка / платформы, один раз для самого JSON):

Я столкнулся с этой проблемой при создании класса в PHP 4 для эмуляции json_encode (доступно в PHP 5). Вот что я придумал:

Я следовал правилам, упомянутым здесь. Я использовал только то, что мне было нужно, но я думаю, что вы можете адаптировать его к вашим потребностям на языке, который вы используете. Проблема в моем случае была не в новых строках, как я изначально думал, а в том, что / не удалось избежать. Я надеюсь, что это предотвратит кого-то еще от маленькой головной боли, которую я поняла, чтобы понять, что я сделала неправильно

В одной из моих программ понадобилась запись данных в формате JSON. Вкратце — XML-подобный формат, вполне подходит на замену Windows INI-файлам или тому же XML. Удобен тем, что поддерживает массивы и вложенность собственных структур, но при этом не замусоривает файл данных своими тегами до полной нечитабельности человеком. Вот пример файла данных:

Формат довольно простой, вполне можно работать с ним без всяких библиотек. Поэтому первоначально за запись отвечал примерно такой участок кода:

Корявенько, хотя вполне работоспособно. Но программа активно дорабатывалась, формат данных менялся по 5 раз на дню и остро встала проблема отслеживания всех изменений. Несмотря на некоторое форматирование исходника было тяжело не забыть закрыть какой-нибудь тег или правильно напечатать нужное число пробелов для форматирования уже собственно файла данных. Даже в приведенном фрагменте перед публикацией обнаружилась ошибка, не ставилась запятая между элементами массива.

Решил я этот техпроцесс слегка механизировать и создать микробиблиотеку для работы с JSON.

Что я хотел? Чтобы в своей программе я писал что-то на псевдоязыке:

А компилятор/программа пусть сами учтут отступы, которые определяют структуру файла данных. В нужный момент подставят открывающий и, главное, закрывающий тег. Дело осложнялось тем, что внутри этого скрипта хотелось использовать конструкции C++, например циклы внутри массивов.

После нескольких дней непрерывной мозговой осады этой проблемы нашлось довольно изящное решение. Для контроля за вложением друг в друга JSON-сущностей и своевременного закрытия тегов используется область видимости переменных. Все очень просто, создается экземпляр одного из классов TJson*** — записывается ключ и открывающий тег и все следующие созданные объекты считаются его вложениями. Уничтожается экземпляр — ставится закрывающий тег.

Простой класс, все назначение которого — временно связать порожденные объекты в некое подобие дерева. Для чего нужен перегруженный operator() будет понятно чуть позже.

У этого класса есть наследник, в котором заложен базовый функционал записи в JSON-формате. Программист должен только переопределить функции Write***.

Функция WriteTab() введена в программу удобства гиков, любящих лазить в файлы данных «Блокнотом». Она должна записать в файл данных перевод строки и число пробелов, соответствующее глубине вложения (TTagCloser::Depth). Если бы форматирование не было нужно, то функция выродилась бы в WriteTab().

У меня в тестовом примере функции Write*** определены так:

JSON-формат предполагает наличие в потоке данных Объектов (смахивают на СИшные структуры), Массивов (они и в Африке массивы) и просто пар «Ключ: Значение». Все это многообразие может быть перемешано и вложено друг в дружку, например в паре «Ключ: Значение» Значением может быть Массив Объектов. Для работы с этими сущностями созданы следующие классы:

Для удобства использования библиотеки в своей программе определены макросы:

Вот и добрались до перегруженного operator(). Он нужен для однократного выполнения тела цикла for, то есть в первый вызов он возвращает true, а в последующие — false.

А вот так в теле программы выглядит скрипт, на котором пишется заполнение файла данных:

Как выглядит сформированный этой программой JSON-файл можно посмотреть в начале статьи. Все запятые проставлены, все скобочки закрыты когда нужно, в каждой строке нужное количество ведущих пробелов — красота!

Я пишу некоторые файлы данных в формате JSON и хотел бы, чтобы некоторые действительно длинные строковые значения были разбиты на несколько строк. Используя JSON-модуль Python, я получаю массу ошибок, использую ли я \ или \n как выход.

Возможно ли иметь многострочные строки в JSON? Это в основном для визуального комфорта, поэтому я полагаю, что я могу просто включить перенос слов в моем редакторе, но мне просто любопытно .

структурируйте свои данные: разбейте многострочную строку на массив строк, а затем объедините их позже. Попробуйте инструмент HJSON. Он преобразует вашу многострочную строку в формате json в правильный формат json.

JSON не допускает реальных разрывов строк. Вам нужно заменить все разрывы строк на \n .

"first line second line"

можно сохранить с помощью:

"first line\nsecond line"

ибо Python это должно быть записано как:

"first line\\nsecond line"

где \\ для экранирования обратной косой черты, в противном случае python будет рассматриваться \n как управляющий символ "новая строка"

-1 ОП в использовании «\ N» последовательности. Это не работает, потому что они не экранируют обратную косую черту , как "\\ n", поэтому Python преобразует escape-последовательность в символ новой строки, а не оставляет ее буквально с обратной косой чертой, за которой следует en, как того требует JSON. @ user359996 Я не уверен, что это правда. Для меня (хранение данных в JSON с помощью just \n и вывод их через Curses), \n похоже, работает нормально. Кажется, это зависит от движка представления / рендеринга. @Nawaz: "\ n" и "\ r" являются escape-последовательностями для перевода строки и возврата каретки, соответственно. Они не являются буквальными символами перевода строки и возврата каретки . В качестве дополнительного примера, чтобы сделать его более понятным, учтите, что «\\» является escape-последовательностью для обратной косой черты, в отличие от буквальной обратной косой черты. Грамматика JSON явно исключает управляющие символы (см. Определение «char») и вместо этого обеспечивает их представление через escape-последовательности (\\, \ r, \ n и т. Д.). @ user359996: Да .. Я видел это позже, хотя я сохраняю свой старый комментарий как таковой, на случай, если кто-то еще возникнет с таким же сомнением, наше обсуждение может помочь им. спасибо, что подтвердил это.

Я должен был сделать это для небольшого проекта Node.js и нашел это обходным :

Это выглядит довольно опрятно для меня, судя по всему, я должен везде использовать двойные кавычки. Хотя в противном случае я мог бы, возможно, использовать YAML, но это имеет другие подводные камни и не поддерживается изначально. После разбора я просто использую myData.modify_head.join('\n') или myData.modify_head.join() , в зависимости от того, хочу ли я разрыв строки после каждой строки или нет.

Это решение для конкретного параметра, не обязательно связанного с вопросом. То, что вы создаете, это не многострочные строки (что в любом случае невозможно), а массивы со строками внутри Это показывает, как вставить новую строку в строках, что не отвечает на вопрос. Этот ответ делает. fgrieu - можно так же легко объединить строки без добавления новой строки. С этим небольшим изменением он обеспечивает обходной путь для многострочных строк (пока вы контролируете указание схемы JSON). Я постараюсь улучшить ответ с этим. Спасибо, мне это нравится. Я собираюсь с этим для того, над чем я работаю. Это выглядит аккуратно и организованно. Я хочу, чтобы каждая новая строка в этом массиве подразумевала разрыв строки в выводимом тексте, хотя это решение может также работать в тех случаях, когда вы не вставляете разрывы строк. Я использовал это решение ранее в своем исходном коде javascript только потому, что мне понравилось, как оно выглядит организованно и как оно не оставляет никаких сомнений относительно того, какие пробелы попадают в финальную строку. Несмотря на оговорки изобретателя JSON, я просто использовал это, чтобы добавить комментарии (без части javascript, но только [] и запятых), чтобы добавить комментарии, чтобы помочь будущему сопровождающему, который мог бы вручную отредактировать мой маленький файл JSON.

И что еще хуже, хорошего ответа нет.

Во многих языках программирования, даже если они явно не поддерживают разбиение строк по строкам, вы все равно можете использовать конкатенацию строк для получения желаемого эффекта; и пока компилятор не ужасен, это нормально.

Но JSON не является языком программирования; это просто представление данных. Вы не можете сказать это, чтобы объединить строки. Также его (довольно маленькая) грамматика не включает каких-либо средств для представления строки в несколько строк.

Если не считать какого-либо препроцессора (а мне, например, не хочется создавать собственный язык для решения этой проблемы), общего решения этой проблемы не существует. Если вы можете изменить формат данных, то вы можете заменить массив строк. В противном случае, это один из многочисленных способов, которыми json не предназначен для удобства чтения.

Непонятно, что хочет ОП, переводить строки в строку или лучше организовывать строку .

Проверьте спецификацию ! Производство символов в грамматике JSON может принимать следующие значения:

  • any-Unicode-символ-кроме- " или- \ или-контроля-символа
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u четыре шестнадцатеричные цифры номера

Символы новой строки являются «управляющими символами», поэтому нет, возможно, в вашей строке нет буквального символа новой строки. Однако вы можете закодировать его, используя любую комбинацию \n и \r вам нужно.

Это правильный ответ, так как он не оставляет двусмысленности. Новые линии будут разрешены, согласно спецификации, при условии , что они надлежащим образом спасся с характером управления. @AliKhaki \ n в JSON не достигнет результата, к которому стремится вопрос. Либо вы думаете о чем-то другом (то есть о встраивании символов новой строки), либо говорите о новой строке в строковом литерале (содержащем JSON) на каком-то языке программирования, который опять-таки является чем-то другим. @LightnessRacesinOrbit да, я ищу новую строку в строке

JSON не позволяет разбивать строки для удобства чтения.

Лучше всего использовать IDE, которая будет для вас переносом строк.

Такой редактор, как BBEdit, который поддерживает «мягкую» перенос строки, идеален. Текст оборачивается так, что все это появляется в видимой области окна редактора, но в конце файла в файле сохраняются только те строки, которые вы вводите (например, ввод каретки). Облегчает редактирование JSON с очень длинными строками, не прибегая к хитростям или хитростям кода.

Это действительно старый вопрос, но я натолкнулся на это в процессе поиска и думаю, что знаю источник вашей проблемы.

JSON не допускает «настоящие» переводы строк в своих данных; он мог только избежать новых строк. Смотрите ответ от @YOU . В соответствии с вопросом, похоже, что вы пытались избежать разрывов строк в Python двумя способами: с помощью символа продолжения строки ( "\" ) или с помощью "\n" в качестве escape.

Но имейте в виду: если вы используете строку в Python, специальные экранированные символы ( "\t" , "\n" ) преобразуются в РЕАЛЬНЫЕ управляющие символы! "\n" будет заменен на управляющий символ ASCII, представляющий символ новой строки, который в точности является недопустимым в JSON. (Что касается символа продолжения строки, он просто выводит новую строку.)

Так что вам нужно сделать так, чтобы Python не экранировал символы. Вы можете сделать это, используя необработанную строку (поместите r перед строкой, как в r"abc\ndef" , или добавив дополнительную косую черту перед символом новой строки ( "abc\\ndef" ).

Оба вышеперечисленных вместо замены "\n" на реальный управляющий символ ASCII новой строки оставят "\n" два литеральных символа, которые затем JSON может интерпретировать как экранирование новой строки.

В настоящее время очень распространено получать JSON String от веб-службы Java вместо XML, но, к сожалению, JDK еще не поддерживает преобразование между JSON String в объект JSON.

Сохранение JSON в качестве String не всегда является хорошим вариантом, поскольку вы не можете легко с ним работать, вам нужно преобразовать его в объект JSON, прежде чем делать что-либо еще, например. получить любое поле или установить разные значения.

Существует много библиотек с открытым исходным кодом, которые позволяют создавать JSON-объекты из форматированной строки JSON, например, Gson от Google, Jackson или просто JSON.

В этом руководстве вы узнаете, как конвертировать и преобразовать строку String в JsonObject, используя 3 основные библиотеки.

Будем использовать следующую строку JSON для примера:

Это просто, который имеет 5 атрибутов, два из которых являются String, а два других являются числовыми. Одним из атрибутов lastScore является массив JSON.

Преобразование строки в объект JSON с использованием Gson

Вы можете конвертировать JSON String в объект Java всего за 2 строки, используя Gson, как показано ниже:

Или преобразовать Java-объект в JSON с помощью метода toJson (), как показано ниже:

Если вы не очень хорошо знакомы с самим форматом JSON, я бы посоветовал прочитать «Beginning JSON» от Ben Smit, чтобы узнать больше.

Конвертирование JSON в объект Java

конвертировать String to JSON object в Java

Полезной особенностью json-simple является то, что она также совместима с JDK 1.2, что означает, что вы можете использовать ее в устаревшем проекте, который еще не в Java 5.

Библиотека Jackson

Jackson, я думаю, самая популярная библиотека синтаксического анализа JSON в мире Java. Она быстрая, многофункциональная и поддерживает потоковую передачу, что отлично подходит для анализа больших выходных данных JSON из веб-сервисов.

С помощью одной строки, вы можете преобразовать строку JSON, представляющую футболиста, в класс Java, представляющий игрока:

Один из недостатков Jackson заключается в том, что для него требуется JDK 1.5, поэтому, если вы застряли в более ранней версии Java, он может там не работать.

Jackson не поддерживает J2ME, но одно из главных преимуществ использования заключается в том, что он поддерживает потоковую передачу, которую можно использовать для анализа большого ответа JSON без полной загрузки его в память.

Вы можете использовать любую из библиотек: json-simple, Gson или Jackson для анализа JSON, полученных от веб-сервисов, каждое из которых имеет свои преимущества.

  1. Json-simple имеет небольшой объем памяти и он вполне подходит для J2ME и Android.
  2. Jackson обладает богатым набором функций, поэтому лучше применять для большого проекта.
  3. Gson находится между ними и применим для общего назначения в программах Java.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Читайте также: