Czy możesz uniknąć konwersji przez Gson „<” i „>” na sekwencje specjalne Unicode?

127

Zauważyłem, że Gson konwertuje ciąg „<” na sekwencję ucieczki Unicode w danych wyjściowych JSON. Czy możesz tego jakoś uniknąć, czy też znaki takie jak „<” i „>” zawsze muszą być znakami ucieczki w JSON?

Rozważmy ten przykład, który drukuje {"s":"\u003c"}; Chciałbym po prostu {"s":"<"}.

public static void main(String[] args) {
    Gson gson = new GsonBuilder().create();
    System.out.println(gson.toJson(new Foo()));  
}

static class Foo {
    String s = "<";
}

Kontekst: element JSON, który tworzę, nie ma nic wspólnego ze stronami HTML ani nawet JavaScriptem; służy po prostu do przekazywania pewnych ustrukturyzowanych informacji do innego oprogramowania (osadzonego w urządzeniu, napisanego w C).

Jonik
źródło
2
Czy GSON robi to domyślnie? Whoa. Jest to raczej dziwne ustawienie domyślne, chociaż całkowicie legalne z punktu widzenia specyfikacji JSON.
StaxMan
3
Tak, dla mnie też było to zaskakujące. Na szczęście lekarstwo jest łatwe, gdy wiesz, gdzie szukać. :) W przeciwnym razie, po jednodniowym doświadczeniu, uważam Gson za naprawdę czystą, ładną bibliotekę, ze świetnym podręcznikiem użytkownika !
Jonik
6
Dzieje się tak również ze znakiem „=”, który zamienia się w „\ u003d”.
Russell Silva

Odpowiedzi:

253

Musisz wyłączyć ucieczkę HTML .

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
BalusC
źródło
11
Zastanawiam się, dlaczego jest domyślnie włączony. JSON nie ma nic wspólnego z HTML. W Spec tylko stany "i `\` muszą być uciekł.
Mark Jeronimus
Chłopaki, to na mnie nie działa. używam '' com.squareup.retrofit2: retrofit: 2.3.0 '' && '' com.squareup.retrofit2: converter-gson: 2.3.0 ''. Proszę pomóż mi.
Mr Code