Podczas ręcznego tworzenia danych JSON, jak zmienić znaczenie pól tekstowych? Należy używać coś jak Apache Commons Langa StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
czy powinienem użyć java.net.URLEncoder
?
Problem polega na tym, że kiedy używam SEU.escapeHtml
, nie unikam cudzysłowów, a kiedy zawijam cały ciąg parą '
s, zostanie wygenerowany zniekształcony JSON.
'
, jesteś skazany na porażkę od samego początku: ciągi JSON można otaczać tylko"
. Zobacz ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
konspektu. Jest całkiem przydatne.Odpowiedzi:
Najlepiej byłoby znaleźć bibliotekę JSON w swoim języku , do której można wprowadzić odpowiednią strukturę danych, i pozwolić jej martwić się, jak uciec . Dzięki temu będziesz zdrowszy. Jeśli z jakiegoś powodu nie masz biblioteki w swoim języku, nie chcesz jej używać (nie sugerowałbym tego¹) lub piszesz bibliotekę JSON, czytaj dalej.
Ucieknij zgodnie z RFC. JSON jest dość liberalny: Tylko znaki muszą uciec się
\
,"
oraz kody sterujące (coś mniej niż U + 0020).Ta struktura ucieczki jest specyficzna dla formatu JSON. Będziesz potrzebować funkcji specyficznej dla JSON. Wszystkie znaki ucieczki można zapisać jako
\uXXXX
gdzieXXXX
jest jednostka kodu UTF-16¹ dla tego znaku. Istnieje kilka skrótów, na przykład\\
, które również działają. (I skutkują mniejszym i wyraźniejszym wyjściem).Aby uzyskać szczegółowe informacje, zobacz RFC .
¹JSON's Escaping jest oparty na JS, więc używa
\uXXXX
, gdzieXXXX
jest jednostką kodu UTF-16. W przypadku punktów kodowych poza BMP oznacza to kodowanie par zastępczych, które mogą być nieco owłosione. (Lub możesz po prostu wyprowadzić znak bezpośrednio, ponieważ kod JSON jest kodowany w formacie Unicode i zezwala na te określone znaki).źródło
"
).{[]}:?
nie mogą być poprzedzane jednym ukośnikiem odwrotnym. (\:
na przykład nie jest prawidłowy w ciągu JSON). Wszystkie z nich można opcjonalnie zmienić za pomocą\uXXXX
składni, marnując kilka bajtów. Zobacz §2.5 RFC.JSON.stringify()
.Wyciąg z Jettison :
źródło
"
,\
i znaki kontrolne (te przed „”) są prawidłowe w ciągach JSON, o ile kodowanie wyjściowe jest zgodne. Innymi słowy, nie musisz kodować „펍”,\uD38D
o ile zachowane jest kodowanie UTF.Spróbuj tego
org.codehaus.jettison.json.JSONObject.quote("your string")
.Pobierz go tutaj: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
źródło
org.json.simple.JSONObject.escape () chroni przed cudzysłowami, \, /, \ r, \ n, \ b, \ f, \ t i innymi znakami sterującymi. Może być używany do ucieczki przed kodami JavaScript.
źródło
Apache commons lang teraz to obsługuje. Tylko upewnij się, że masz wystarczająco aktualną wersję Apache commons lang w swojej ścieżce klas. Będziesz potrzebować wersji 3.2+
Uwagi do wydania dla wersji 3.2
LANG-797: Dodano escape / unescapeJson do StringEscapeUtils.
źródło
/
znaków. To psuje wiele rzeczy, w tym JSON z zawartymi w nim adresami URL. Oryginalna propozycja miała/
być specjalną postacią do ucieczki, ale tak już nie jest, jak widać w najnowszej specyfikacji w momencie pisaniaorg.json.JSONObject
quote(String data)
metoda spełnia swoje zadanieWyciąg z dokumentacji:
źródło
org.apache.sling.commons.json.JSONObject
też ma to samoStringEscapeUtils.escapeJavaScript
/ teżStringEscapeUtils.escapeEcmaScript
powinien załatwić sprawę.źródło
escapeJavaScript
zapisuje pojedyncze cudzysłowy jako\'
, co jest nieprawidłowe.Jeśli używasz fastexml jackson, możesz użyć następujących:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Jeśli używasz codehaus jackson, możesz użyć:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
źródło
Nie jestem pewien, co masz na myśli, mówiąc „ręczne tworzenie pliku json”, ale możesz użyć czegoś takiego jak gson ( http://code.google.com/p/google-gson/ ), a to przekształci Twoją HashMap, Array, String itp. na wartość JSON. Zalecam wybranie do tego ram.
źródło
Nie poświęciłem czasu na upewnienie się w 100%, ale zadziałało na tyle, że moje dane wejściowe zostały zaakceptowane przez internetowe walidatory JSON:
chociaż nie wygląda lepiej niż
org.codehaus.jettison.json.JSONObject.quote("your string")
Po prostu używam już narzędzi dynamicznych w moim projekcie - moje „ręczne budowanie JSON” odbywało się w szablonie szybkości
źródło
Dla tych, którzy przybyli tutaj, szukając rozwiązania wiersza poleceń, jak ja, cURL --data-urlencode działa dobrze:
wysyła
, na przykład. Większe dane JSON można umieścić w pliku i można użyć składni @, aby określić plik do slurp w danych, z których mają zostać usunięte zmiany znaczenia. Na przykład, jeśli
użyłbyś
A teraz jest to również samouczek dotyczący wysyłania zapytań do Freebase z wiersza poleceń :-)
źródło
Użyj klasy EscapeUtils we wspólnym interfejsie API.
źródło
Rozważmy Moshi „s JsonWriter klasę. Ma cudowne API i ogranicza kopiowanie do minimum, wszystko można ładnie przesyłać strumieniowo do pliku, OutputStream itp.
Jeśli chcesz mieć sznurek w dłoni:
źródło
Apache commons-text ma teraz StringEscapeUtils.escapeJson (String) .
źródło
Jeśli chcesz pominąć JSON w ciągu JSON, użyj org.json.JSONObject.quote („Twój ciąg json, który wymaga zmiany znaczenia”) wydaje się działać dobrze
źródło
używając składni \ uXXXX możesz rozwiązać ten problem, google UTF-16 z nazwą znaku, możesz znaleźć XXXX, na przykład: podwójny cudzysłów utf-16
źródło
Wszystkie metody pokazujące rzeczywistą implementację są wadliwe.
Nie mam kodu Java, ale dla przypomnienia, możesz łatwo przekonwertować ten kod C #:
Dzięki uprzejmości mono-project @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Można to zagęścić w
źródło
quote()
sposób metoda opisana w innych odpowiedziach jest wadliwa?Myślę, że najlepszą odpowiedzią w 2017 roku jest użycie interfejsów API javax.json. Użyj javax.json.JsonBuilderFactory, aby utworzyć obiekty json, a następnie wypisz obiekty przy użyciu javax.json.JsonWriterFactory. Bardzo fajne połączenie konstruktora / pisarza.
źródło