2010-03-06 6 views
359

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

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

+1

Возможный дубликат [Как мне справиться с новой строки в формате JSON] (https://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json) – Flimzy

ответ

227

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

+55

-1 OP * * использует escape-последовательность «\ n». Это не работает, потому что они не сбрасывают обратную косую черту *, как «\\ n», поэтому Python преобразует escape-последовательность в символ новой строки, а не оставляет ее буквально обратной косой чертой, за которой следует en, как требует JSON. – user359996

+4

@ user359996 Я не уверен, что это правда. Для меня (хранение данных в JSON только с '\ n' и вывод его через Curses),' \ n', похоже, работает нормально. Кажется, это зависит от механизма просмотра/рендеринга. – ashes999

+2

Последовательности новой строки действительно специфичны для платформы (см. Http://en.wikipedia.org/wiki/Newline#Representations). Тем не менее, в расчете на @Lightness Races в ответе Orbit, в курсоре JSON нет ни строк, ни символов перевода строки. Я на самом деле не программист на Python, поэтому я не уверен, что происходит в вашем случае, но либо ваш синтаксический анализатор сломан, либо вы не передаете его, как вы думаете. Возможно, этот ответ объясняет это лучше: http://stackoverflow.com/a/9295597/359996. Обратите внимание, особенно на бит о двойном экранировании. – user359996

145

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

{ 
"modify_head": [ 

    "<script type='text/javascript'>", 
    "<!--", 
    " function drawSomeText(id) {", 
    " var pjs = Processing.getInstanceById(id);", 
    " var text = document.getElementById('inputtext').value;", 
    " pjs.drawText(text);}", 
    "-->", 
    "</script>" 

], 

"modify_body": [ 

    "<input type='text' id='inputtext'></input>", 
    "<button onclick=drawSomeText('ExampleCanvas')></button>" 

], 
} 

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

+17

Это решение для конкретной настройки, не обязательно связанное с вопросом. То, что вы создаете там, - это не многострочные строки (что в любом случае невозможно), но массивы со строками внутри –

+2

Это показывает, как вставлять новую строку в строки, которая НЕ отвечает на вопрос. [Этот ответ] (https://stackoverflow.com/a/27256893/903600). – fgrieu

+1

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

31

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

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

Но имейте в виду: если вы используете строку в python, специальные экранированные символы ("\ t", "\ n") переводятся в символы REAL! «\ N» будет заменен на управляющий символ ASCII, представляющий символ новой строки, который является именно тем символом, который является незаконным в JSON. (Что касается символа продолжения линии, он просто выводит новую строку.)

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

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

70

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

  • любой-Unicode-символов except- " -или- \ -или-контроль символов
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \uчетыре-гекс-цифры

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

+0

Теперь это ECMA-404)) http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf – gavenkoa

+1

Это правильный ответ, поскольку он не оставляет никакой двусмысленности. Новые строки * разрешены по спецификации, если они правильно экранированы с помощью управляющего символа. – Ryan

-14

поместить многострочный текст на текстовый файл, а затем

var str = { 
    text: cat('path_to_file/text.txt') 
} 

(она работает на MongoDB)

+4

-1: Это вводящий в заблуждение ответ. Он не является действительным JSON и не работает в javascript, поскольку нет функции с именем 'cat'. –

8

Использование регулярных выражений, чтобы заменить все вхождения \r\n\\n с.

Это работало для меня в scala.

val newstr = str.replace("\r\n", "\\n") 
+0

Почему 3 обратной косой черты? – neXus

+3

@neXus Я не знаю, почему, но кто-то отредактировал его до 3 обратных косых черт. Благодаря LightnessRacesInOrbit для его исправления. – Sikander

22

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

Ваш лучший выбор - использовать IDE, который будет обертывать вас линией.

+0

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

-17

Вы можете попробовать место <div></div> между предложениями.

+1

Может ли это быть даже серьезным? : D –

+4

Требуется больше jQuery. – undefined

+0

надеюсь, что 2 upvotes предназначены для шутки –

-8

написать любой текст в Notepad ++ с несколькими многострочный затем нажмите CTL + а и CTL + J, чтобы расположить их в одной строке

В JSON записи файла:

{ 
"key":"multi line copied from notepad++" 
} 
+0

Это, казалось, полностью удалило все новые строки! Возможно, более полезно здесь упомянуть, как заменить жесткие символы новой строки на/n в Notepad ++. – Bernard

11

Написать значение свойства в виде массив строк. Пример, приведенный здесь https://gun.io/blog/multi-line-strings-in-json/. Это поможет.

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

{ 
    "singleLine": "Some singleline String", 
    "multiline": ["Line one", "line Two", "Line Three"] 
} 

И мы можем легко итерировать массив, чтобы отображать контент в многострочном режиме.

+0

Я бы предложил вам добавить информацию в свой ответ по ссылке, потому что ссылки могут быть повреждены в будущем. – YoungHobbit

-5
fieldval = rs.getString(rs.getMetaData().getColumnName(i)) 
    .trim() 
    .replace("\\", "/") 
    .replace("\r\n", "\\n") 
    .replace("''", "\\n") 
    .replace("\"", "\\n"); 
+10

Некоторые объяснения повысят качество вашего ответа. – m02ph3u5

-3

{{имя}} {{
имя1}}

my.opt.push ({ 'Имя': 'строка1', 'имя1': 'строка2')

+0

Я дал
тег между именем и именем1 –

3

Возможно ли иметь многострочные строки в JSON?

Да. Я только что протестировал это сейчас со своим веб-браузером Firefox, нажав F12, нажав консоль и набрав в нижней части экрана.

x={text:"hello\nworld"} 

Объект x только что был создан из строки формата JSON, содержащей многострочную строку.

console.log(x.text) 
hello 
world 

Отображается x.text, показывающий, что это многострочная строка.

Эти два теста показывают, что интерпретатор Javascript Firefox с удовольствием создает и использует JSON с многострочными строками.

Другие тесты с JSON.stringify и JSON.parse показали, что интерпретатор Javascript может преобразовать объект, содержащий многострочные строки в JSON, и проанализировать его снова без каких-либо проблем.

В прошлом я хранил полные произведения Шекспира как свойство в объекте JSON, а затем отправлял его через Интернет, без искажений.

Пример

Вот две строки строка, введенная в течение трех линий

x={text:"expert\ 
s\nex\ 
change"} 

Мы можем отобразить объект

console.log(x) 

давая

Object { text: "experts\nexchange" } 

или строку

console.log(x.text) 

давая

experts 
exchange 

конце строк в строки результата от использования \ N и множественные входные линии достигаются при использовании только \ в конце строки.

На практике вы можете синхронизировать концы строк с строками в строке, например.

x={text:"experts\n\ 
exchange"} 

Multi-Line Длина строки

console.log("Hello\nWorld".length) 
11 
console.log("Hello World".length) 
11 

Обратите внимание, что строка с новой строки не длиннее строки с пространством. Несмотря на то, что на клавиатуре были введены два символа ('\' и 'n'), в строке сохраняется только один символ.

1

Wrap каждая строка в кавычках и заканчиваться их запятой, как показано ниже:

"content": [ 
    "This is the first line", 
    "this is second", 
    "and so on" 
] 
+2

Это массив, содержащий три строки, а не строку, разделенную на три строки. – tripleee

+0

@tripleee Это очень распространенный подход. Даже VSCode делают это. Проверьте их фрагменты кода пользователя. –

+1

Это может быть, но это не многострочная строка, и, следовательно, на самом деле не ответ на этот вопрос. – tripleee

2

Не JSON ответ, но альтернатива для людей, имеющих дело с «JSON-подобных» данных в CoffeeScript.

CSON (С Оффи S cript ОН ▪ Таблица otation) изначально обрабатывает многострочные строки:

singleline: 'single line' 
multiline: ''' 
    line one 
    line two 
    line three 
    ''' 

в исходном хранилище доступна на https://github.com/bevry/cson.

0

вы можете просто запустить код ниже с вашим желанием многострочного строки между тильдой ~ характер:

var multiLineString = ` 
this 
    is 
     the 
      multiline 
        String 

`; 
JSON.stringify(multiLineString); 
+0

Это не отвечает на вопрос. Символы, помещенные между символами могилы ('), являются литералами шаблонов ES6, основной задачей которых является шаблонная строка, а не поддержка многострочного текста в этом формате. Хотя вы _can_ технически используете их, как показано здесь, все, что приводит к тому, что это строка, отформатированная как таковая: '' "\ nthis \ n \ n \ n многострочный \ n String \ n \ n" "' Это недопустимо JSON и не отвечает на вопрос OP. В других ответах выше рассмотрим вопрос лучше. – TuxToaster

Смежные вопросы