2010-03-06 19 views
359

Piszę niektóre pliki danych w formacie JSON i chciałbym mieć naprawdę długie wartości ciągów podzielone na wiele linii. Korzystając z modułu JSON Pythona otrzymuję mnóstwo błędów, niezależnie czy używam \ czy \n jako ucieczki.Ciągi wielowierszowe w JSON

Czy w JSON można mieć łańcuchy wieloliniowe? Jest to głównie dla komfortu wizualnego, więc przypuszczam, że mogę po prostu włączyć edytor tekstu w moim edytorze, ale jestem po prostu trochę ciekawy ...

+1

Możliwy duplikat [? Jak obsługiwać nowe linie w JSON] (https://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json) – Flimzy

Odpowiedz

227

JSON nie pozwala na prawdziwe podziały wiersza. Musisz zamienić wszystkie podziały wierszy na \n.

+55

-1 OP * to * użycie sekwencji "\ n". Nie działa, ponieważ nie * ucieka z ukośnika odwrotnego *, jako "\\ n", więc Python przekształca sekwencję specjalną w znak nowego wiersza, zamiast pozostawić go dosłownie jako ukośnik odwrotny, po którym następuje en, tak jak wymaga tego JSON. – user359996

+4

@ user359996 Nie jestem pewien, czy to prawda. Dla mnie (przechowywanie danych w JSON przy użyciu '\ n' i wyprowadzanie go przez Curses),' \ n' wydaje się działać w porządku. Wydaje się, że zależy to od silnika widoku/renderowania. – ashes999

+2

Sekwencje Newline są rzeczywiście związane z platformą (patrz http://en.wikipedia.org/wiki/Newline#Representations). Jednakże, na wyścigi @ Lightness w odpowiedzi na orbitę, ani znaki powrotu kursora, ani znaki przesunięcia linii nie są w gramatyce JSON. Właściwie nie jestem programistą w Pythonie, więc nie jestem pewien, co się dzieje w twoim przypadku, ale albo twój parser jest zepsuty, albo nie przekazujesz tego, co myślisz, że jesteś. Może ta odpowiedź wyjaśnia to lepiej: http://stackoverflow.com/a/9295597/359996. Zwróć uwagę na bit o podwójnym ucieczce. – user359996

145

musiałem zrobić to dla małego projektu node.js i znalazłem to obejście:

{ 
"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>" 

], 
} 

To wygląda całkiem miłe dla mnie, appart od tego muszę używać cudzysłowów wszędzie . Chociaż w przeciwnym razie mógłbym użyć YAML, ale ma to inne pułapki i nie jest obsługiwany natywnie. Po przeanalizowaniu, używam tylko myData.modify_head.join('\n') lub myData.modify_head.join(), w zależności od tego, czy chcę, aby po każdym łańcuchu była przerwa liniowa, czy też nie.

+17

To rozwiązanie dla określonego ustawienia, niekoniecznie związane z pytaniem. To, co tworzysz, nie jest ciągami wielowierszowymi (co i tak nie jest możliwe), ale tablice z ciągami wewnątrz –

+2

To pokazuje jak wstawić znak nowej linii w łańcuchach, które NIE odpowiadają na pytanie. [Ta odpowiedź] (https://stackoverflow.com/a/27256893/903600) robi. – fgrieu

+1

fgrieu - można równie łatwo łączyć łańcuchy bez dodawania nowego wiersza. Dzięki tej niewielkiej zmianie zapewnia obejście dla łańcuchów wielowierszowych (o ile kontrolujesz specyfikację schematu JSON). Spróbuję poprawić odpowiedź w ten sposób. – drrob

31

To jest naprawdę stare pytanie, ale natknąłem się na to podczas wyszukiwania i myślę, że znam źródło twojego problemu.

JSON nie zezwala na "prawdziwe" znaki nowej linii w swoich danych; mogło tylko uciec przed nowymi liniami. Zobacz odpowiedź z @YOU powyżej. Zgodnie z pytaniem wygląda na to, że próbujesz uniknąć łamania linii w Pythonie na dwa sposoby: używając znaku kontynuacji linii ("\") lub używając "\ n" jako wyjścia.

Należy jednak pamiętać: jeśli używasz ciągu znaków w pythonie, specjalne znaki ze znakami escape ("\ t", "\ n") są przekształcane na PRAWDZIWE znaki kontrolne! "\ N" zostanie zastąpione przez znak kontrolny ASCII reprezentujący znak nowego wiersza, który jest właśnie postacią, która jest nielegalna w JSON. (Jeśli chodzi o znak kontynuacji linii, to po prostu wychodzi z nowej linii).

Musisz więc powstrzymać Pythona przed ucieczką od znaków. Można to zrobić przy użyciu surowego ciąg (umieścić r przed ciągiem, jak w r"abc\ndef", lub poprzez włączenie dodatkowych ukośnik przed znakiem nowej linii ("abc\\ndef").

obu powyższych woli, zamiast zastąpienia "\ n" z rzeczywistym znakiem kontrolnym ASCII nowej linii, pozostawi "\ n" jako dwa literalne znaki, które następnie JSON może zinterpretować jako znak nowej linii ucieczki:

70

Sprawdź the specification!char produkcja JSON gramatyki może przyjmować następujące wartości:

  • any-Unicode-character-except- " -lub- \ -lub-control-znakowy
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \ucztery hex-cyfry

Znaki nowej linii są "znaki sterujące" tak, nie, nie może mieć dosłownego przełamane w ciągu twój ciąg. Można go jednak kodować przy użyciu dowolnej kombinacji i \r.

+0

Teraz ECMA-404)) http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf – gavenkoa

+1

To jest poprawna odpowiedź, ponieważ nie pozostawia żadnych wątpliwości. Nowe wiersze * są * dozwolone, zgodnie ze specyfikacją, o ile są odpowiednio oznaczone znakiem kontrolnym. – Ryan

-14

umieścić tekstu wielowierszowego w pliku txt, a następnie

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

(to działa w sprawie MongoDB)

+4

-1: to jest myląca odpowiedź. Nie jest to poprawny JSON ani nie działa w javascript, ponieważ nie ma funkcji o nazwie 'cat'. –

8

Korzystanie regex aby zastąpić wszystkie wystąpienia \r\n z \\n.

To zadziałało dla mnie w scala.

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

Dlaczego 3 tylne ukośniki? – neXus

+3

@neXus Nie wiem dlaczego, ale ktoś redagował go do 3 backslashes. Dzięki LightnessRacesInOrbit za poprawienie tego. – Sikander

22

JSON nie pozwala na łamanie linii dla czytelności.

Najlepiej jest użyć IDE, który będzie dla Ciebie zawijany.

+0

Edytor taki jak BBEdit, który obsługuje "miękkie" zawijanie wierszy, jest idealny. Zawijany tekst tak, aby wszystko pojawiło się w widocznym obszarze okna edytora, ale tylko zapisane zakończenia linii (np. Trafienie powrotu karetki) są zachowywane w pliku po zapisaniu. Ułatwia edytowanie JSON z naprawdę długimi łańcuchami bez uciekania się do sztuczek kodu lub hackowania. – cshotton

-17

Możesz spróbować umieścić <div></div> między zdaniami.

+1

Czy to może być nawet poważne? : D –

+4

Potrzebuje więcej jQuery. – undefined

+0

nadzieję, że 2 upvotes są ze względu na żart –

-8

napisać dowolny tekst w Notepad ++ z multi linii następnie naciśnij CTRL + A i CTRL + J, aby zorganizować je w jednej linii

w pliku json napisz:

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

To wydawało się całkowicie usunąć wszystkie nowe linie! Może wspomnieć o tym, jak zastąpić twarde znaki nowej linii za pomocą/n w Notatniku ++. – Bernard

11

zapisać wartości mienia w tablica łańcuchów. Podobny przykład podano tutaj: https://gun.io/blog/multi-line-strings-in-json/. To pomoże.

Zawsze możemy używać tablic ciągów dla łańcuchów wielowierszowych, jak na przykład.

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

I możemy łatwo iterować tablicę, aby wyświetlać zawartość w sposób wieloliniowy.

+0

Chciałbym zasugerować, aby dodać informacje w odpowiedzi z linku, ponieważ linki mogą pękać w przyszłości. – YoungHobbit

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

Niektóre wyjaśnienia podniosłyby jakość odpowiedzi. – m02ph3u5

-3

{{nazwa}}
{{nazwa1}}

my.opt.push ({ 'Nazwa' '1. wiersz', 'nazwa1': 'wiersz 2')

+0

Podałem
znacznik między nazwą i nazwą1 –

3

Czy w JSON można mieć łańcuchy wieloliniowe?

Tak. Właśnie przetestowałem to teraz w przeglądarce Firefox, naciskając klawisz F12, klikając konsolę i pisząc na dole ekranu.

x={text:"hello\nworld"} 

Obiekt x właśnie został utworzony z ciągu formatu JSON zawierającego ciąg wieloliniowy.

console.log(x.text) 
hello 
world 

x wyświetla tekst pokazujący, że jest to ciąg wieloliniowy.

Te dwa testy pokazują, że interpreter Javascript z Firefoksa chętnie tworzy i używa JSON z ciągami wielowierszowymi.

Więcej testów z JSON.stringify i JSON.parse pokazało, że interpreter Javascript może przekonwertować obiekt zawierający łańcuchy wielowierszowe na JSON i przeanalizować go ponownie bez problemu.

W przeszłości przechowywałam całe dzieła Szekspira jako własność w obiekcie JSON, a następnie wysyłałam go przez Internet, bez zakłóceń.

Przykład

Oto ciąg dwóch linii wszedł na trzech liniach

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

Możemy wyświetlić obiekt

console.log(x) 

dając

Object { text: "experts\nexchange" } 

lub ciąg

console.log(x.text) 

dając

experts 
exchange 

końcu linii w wyniku ciąg z użyciem \ n a wiele linii wejściowych są osiągane przy użyciu tylko \ na końcu linii.

W praktyce możesz chcieć zsynchronizować zakończenia linii z tymi w łańcuchu, np.

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

Linia Multi-String Długość

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

Zauważ, że napis z nowej linii jest nie dłuższy niż struny z przestrzenią. Mimo że na klawiaturze wpisano dwa znaki ("\" i "n"), tylko jeden znak jest zapisany w ciągu znaków.

1

Wrap każda linia w cudzysłowie i kończy je przecinkiem, jak pokazano poniżej:

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

Jest to tablica zawierająca trzy ciągi, a nie ciąg podzielony na trzy wiersze. – tripleee

+0

@tripleee Jest to bardzo powszechne podejście. Nawet VSCode działa w ten sposób. Sprawdź ich fragmenty kodu użytkownika. –

+1

Może tak być, ale nie jest to ciąg wieloliniowy, a zatem nie jest to odpowiedź na to pytanie. – tripleee

2

Nie odpowiedź JSON, ale alternatywą dla osób zajmujących się „JSON-like” danych w coffeescript.

CSON (C Offee S CRIPT O bject N otation) natywnie obsługuje wielo ciągi:

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

oryginalny repozytorium dostępne https://github.com/bevry/cson.

0

można po prostu uruchomić kod poniżej swoje pragnienie wielowierszowego łańcucha między tyldą ~ charakter:

var multiLineString = ` 
this 
    is 
     the 
      multiline 
        String 

`; 
JSON.stringify(multiLineString); 
+0

To nie odpowiada na pytanie. Postacie umieszczone między gróbami (') to literały szablonów ES6, których głównym celem jest szablonowa ciąg znaków, a nie obsługa tekstu wielowierszowego w tym formacie. Podczas _możesz_ technicznie wykorzystać je jak pokazano tutaj, wszystko, co skutkuje to ciąg sformatowany jako takie: ' "" \ nW \ n \ n \ n multilinii \ n String \ n \ n ""' Który nie jest prawidłowy JSON i nie odpowiada na pytanie OP. Inne odpowiedzi powyżej lepiej rozwiązują ten problem. – TuxToaster

Powiązane problemy