web-dev-qa-db-fra.com

Gson - Citation automatique (") s'échappant?

J'utilise GSON sur mon Java EE pour fournir du json aux vues. Dans certains objets, j'ai un texte long, qui peut contenir n'importe quoi (comme 'Quelle "grande" nouvelle!' ' ).

Je suis supposé que par défaut GSON n'échappe pas à la double citation, donc il ne génère pas de JSON valide.

Existe-t-il un bon moyen de procéder?

30
Stéphane Piette

Peut-être que je ne comprends pas votre question, mais j'ai réussi à faire en sorte que GSON gère les chaînes avec des guillemets sans aucun paramètre ni changement.

import com.google.gson.Gson;

public class GSONTest {

    public String value;

    public static void main(String[] args) {
        Gson g = new Gson();
        GSONTest gt = new GSONTest();
        gt.value = "This is a \"test\" of quoted strings";
        System.out.println("String: " + gt.value);
        System.out.println("JSON: " + g.toJson(gt));
    }
}

Production:

String: This is a "test" of quoted strings
JSON: {"value":"This is a \"test\" of quoted strings"}

Peut-être que je ne comprends pas ce que vous demandez?

13
Todd

Voici un exemple de code GSON:

final JsonObject obj = new JsonObject();
obj.addProperty("foo", "b\"a\"r");
System.out.println(obj.toString());

La sortie est:

{"foo": "b \" a\"r"}

(comme cela devrait être)

Donc, soit vous faites quelque chose de mal, soit vous utilisez une ancienne version de GSON. Vous devriez peut-être montrer une partie de votre code?

8
Sean Patrick Floyd

Voilà ce que j'ai fait pour résoudre ce problème

private final Gson mGson;
{
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(String.class, new EscapeStringSerializer());
    mGson = builder.create();
}

private static class EscapeStringSerializer implements JsonSerializer<String> {
    @Override
    public JsonElement serialize(String s, Type type, JsonSerializationContext jsonSerializationContext) {
        return new JsonPrimitive(escapeJS(s));
    }

    public static String escapeJS(String string) {
        String escapes[][] = new String[][]{
                {"\\", "\\\\"},
                {"\"", "\\\""},
                {"\n", "\\n"},
                {"\r", "\\r"},
                {"\b", "\\b"},
                {"\f", "\\f"},
                {"\t", "\\t"}
        };
        for (String[] esc : escapes) {
            string = string.replace(esc[0], esc[1]);
        }
        return string;
    }
}
7
mc.dev

Essayez d'utiliser setPrettyPrinting avec l'échappement DisableHtml.

Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
 JsonParser jp = new JsonParser();
 JsonElement je = jp.parse(jsonArray.toString());
 System.out.println( gson.toJson(je));
7
Ammad