Czy wartość JSON może zawierać ciąg wielowierszowy

114

Piszę plik JSON, który byłby odczytywany przez program Java. Fragment wygląda następująco ...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}
user2409155
źródło
4
możliwy duplikat ciągów wielowierszowych w JSON
Lightness Races in Orbit
17
Myślę, że chodzi bardziej o czytelność zserializowanego pliku JSON, a nie o podziały wierszy w ładowanych danych (a zatem nie jest to duplikat ciągów wielowierszowych w JSON ). Pomyśl o tym bardziej jak o używaniu JSON jako pliku konfiguracyjnego, w którym masz długi ciąg znaków, a ze względu na czytelność pomocne jest sztywne zawijanie ciągu na wypadek, gdyby ktoś go edytował za pomocą edytora tekstu.
zashu
2
@zashu: Większość edytorów tekstu ma funkcję miękkiego zawijania. Jest to od razu bardziej przydatne niż pewna zakodowana szerokość linii.
Wyścigi lekkości na orbicie,
4
@LightnessRacesinOrbit uruchamianie różnic git (lub rozwiązywanie konfliktów scalania) na plikach z tak długimi liniami jest również uciążliwe.
Hubert Kario
1
To jest kopia wielowierszowego ciągu w JSON, cytując pytanie OP: „ Czy można mieć ciągi wieloliniowe w JSON? Jest to głównie dla wygody wizualnej, więc przypuszczam, że mogę po prostu włączyć zawijanie słów w moim edytorze, ale ja Jestem trochę ciekawy ...
Andre Figueiredo

Odpowiedzi:

61

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

  • any-Unicode-character-except- "-lub- \-lub-control-znakowy
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u cztery cyfry szesnastkowe

Nowe linie to „znaki kontrolne”, więc nie, możesz nie mieć dosłownego znaku nowej linii w ciągu. Możesz go jednak zakodować, używając dowolnej kombinacji \ni \rwymaganej.

W JSONLint potwierdza narzędziowe że JSON jest nieprawidłowy.


Aktualizacja: A jeśli chcesz pisać znaki nowej linii w składni JSON bez faktycznego dodawania nowych linii do danych, masz nawet podwójny pech. Chociaż JSON ma być do pewnego stopnia przyjazny dla człowieka, nadal jest to dane i próbujesz zastosować dowolne formatowanie do tych danych. Absolutnie nie o to chodzi w JSON.

Wyścigi lekkości na orbicie
źródło
32

Nie jestem pewien Twoich dokładnych wymagań, ale jednym z możliwych rozwiązań poprawiających „czytelność” jest przechowywanie ich jako tablicy.

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

Dołącz ponownie w razie potrzeby z

result.join(" ")
Brian McAuliffe
źródło
13
To jest jednak nieemantyczne. To wyciek abstrakcji. Uznałbym, że określony w ten sposób format danych jest zasadniczo uszkodzony.
Wyścigi lekkości na orbicie
4
Nie wyobrażam sobie projektowania API lub dokumentu JSON w ten sposób tylko po to, aby zwiększyć czytelność napisów (chyba tylko z powodów debugowania): | ....
Adam Dyga
„Uznałbym, że określony w ten sposób format danych jest zasadniczo uszkodzony”. Weź jednak pod uwagę, że dotyczy to przypadku testowego. Jeśli chcesz na stałe zakodować ciągi znaków, prawdopodobnie potrzebujesz pliku właściwości. Osobiście nie przechowywałbym „prawdziwych” danych w formacie JSON w normalnych okolicznościach. Ale jeśli jest to prosty sposób na przejście od braku testów do testów, to idź do niego.
sf_jeff
@AdamDyga w rzeczywistości może być przydatne do przechowywania plików json w CVS, gdzie jednostką delta jest linia.
yota
7

Niezbyt dobre rozwiązanie, ale możesz wypróbować narzędzie hjson . Link . Pozwala na pisanie tekstu wielowierszowego w edytorze, a następnie konwertuje go na właściwy prawidłowy format JSON. Uwaga: dodaje znaki „\ n” do nowych linii, ale możesz je po prostu usunąć w dowolnym edytorze tekstu za pomocą funkcji „Zamień wszystko…”.

PS Powinien być komentarzem do pytania, ale nie mam wystarczającego repozytorium, przepraszam.

CodeMonkey
źródło
Właściwie to dobry pomysł. Kontroluj wersję Hjson i transponuj go do JSON w razie potrzeby.
Wyścigi lekkości na orbicie
3

Jak mogłem zrozumieć, pytanie nie dotyczy tego, jak przekazać ciąg z symbolami kontrolnymi za pomocą, jsonale jak przechowywać i przywracać json w pliku, w którym można podzielić ciąg za pomocą symboli kontrolnych edytora.

Jeśli chcesz przechowywać ciąg wielowierszowy w pliku, plik nie będzie przechowywać prawidłowego jsonobiektu. Ale jeśli używasz jsonplików tylko w swoim programie, możesz przechowywać dane tak, jak chcesz i ręcznie usuwać wszystkie znaki nowej linii z pliku za każdym razem, gdy ładujesz go do programu, a następnie przekazujesz do parsera json.

Lub, alternatywnie, co byłoby lepsze, możesz mieć swoje jsonpliki źródłowe danych, w których edytujesz żądło, jak chcesz, a następnie usuniesz wszystkie nowe wiersze za pomocą jakiegoś narzędzia z prawidłowego jsonpliku, którego będzie używał twój program.

JustAnotherCurious
źródło
2

Uważam, że to zależy od używanego interpretera json ... w zwykłym javascript można użyć terminatorów linii

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}
Elric Best
źródło
To jest poprawne, ale spacje wcięć zwrócą: a\ c=> a c.
Andre Figueiredo
1
JavaScript nie ma „interpretera JSON”, który by to zaakceptował. Może zawierać tylko JSON w ciągu. To prawda, jeśli podałeś JSON wewnątrz literału ciągu, możesz zastosować takie podejście, ale to niezwykła rzecz. Czy mylisz JSON z rzeczywistymi deklaracjami obiektów w JavaScript?
Wyścigi lekkości na orbicie