Gson: convertir directement String en JsonObject (pas de POJO)


301

Je n'arrive pas à comprendre cela. J'essaie de manipuler l'arborescence JSON dans GSON, mais j'ai un cas où je ne connais pas ou n'ai pas de POJO pour convertir une chaîne en, avant de convertir en JsonObject. Existe-t-il un moyen de passer directement de a Stringà JsonObject?

J'ai essayé ce qui suit (syntaxe Scala):

val gson = (new GsonBuilder).create

val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject])

mais aéchoue, le JSON est échappé et analysé comme un JsonStringseul, et brenvoie un vide JsonObject.

Des idées?


1
Méfiez-vous des pièges de validation gson: stackoverflow.com/questions/43233898/…
Vadzim

Réponses:


526

utiliser JsonParser; par exemple:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();

17
ugh devrait avoir une méthode pratique de doublure statique
Blundell

43
le casting vers JsonObject est inutile, mieux utilisénew JsonParser().parse(..).getAsJsonObject();
Chriss

1
Je suppose que JsonParser est une classe abstraite
Jatin Sehgal

1
@KevinMeredith votre lien est cassé, utilisez ceci s'il vous plaît
Ninja

4
Notez que cette méthode est désormais obsolète. Utilisez JsonParser.parseString(str).getAsJsonObject().
Michael Röhrig

147

Essayez d'utiliser à la getAsJsonObject()place d'une distribution directe utilisée dans la réponse acceptée:

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();

2
Pour une raison quelconque, il se termine par membersla clé parent. Voici un exemple {"members": {"key1": "13756963814f2c594822982c0307fb81", "key2": true, "key3": 123456789}}
Hossain Khan

1
Utilisez la dernière bibliothèque gson, comme 2.2.4. La version comme 2.2.2 ajoute une balise de membre pour une raison quelconque.
Rubin Yoo

2
JsonParser (). Parse () est déconseillé dans les nouvelles versions de Gson. Utilisez JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()ou Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
Jimmy Garpehäll

54
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();

pouvez-vous valider ma réponse avec GSON façon de convertir les données de la liste en jsonobject par gson stackoverflow.com/questions/18442452/…
LOG_TAG

3
J'ai validé votre réponse.
Purushotham

@knoxxs, vous voulez dire JsonObjectla définition de classe? Il provient de la bibliothèque Gson de Google. Vous pouvez consulter la documentation ici .
Purushotham

Cela me donne une erreur de se plaindre que JsonElement n'a pas de constructeur sans argument.
clapas

37

Le moyen le plus simple consiste à utiliser la JsonPrimitiveclasse, qui dérive de JsonElement, comme indiqué ci-dessous:

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();

2
Ceci est la réponse la plus simple et m'a aidé. Merci!
khiner

11

Je viens de rencontrer le même problème. Vous pouvez écrire un désérialiseur personnalisé trivial pour la JsonElementclasse:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

GsonBuilder gson_builder = new GsonBuilder();
gson_builder.registerTypeAdapter(
        JsonElement.class,
        new JsonDeserializer<JsonElement>() {
            @Override
            public JsonElement deserialize(JsonElement arg0,
                    Type arg1,
                    JsonDeserializationContext arg2)
                    throws JsonParseException {

                return arg0;
            }
        } );
String str = "{ \"a\": \"A\", \"b\": true }";
Gson gson = gson_builder.create();
JsonElement element = gson.fromJson(str, JsonElement.class);
JsonObject object = element.getAsJsonObject();

4

Je pense que c'est une approche plus simple:

public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{

    public JsonElement serialize(HibernateProxy object_,
        Type type_,
        JsonSerializationContext context_) {
        return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject();
        // that will convert enum object to its ordinal value and convert it to json element

    }

    public static <T> T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer()
                    .getImplementation();
        }
        return entity;
    }
}

Et puis vous pourrez l'appeler comme ceci:

Gson gson = new GsonBuilder()
        .registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
        .create();

De cette façon, tous les objets en veille prolongée seront convertis automatiquement.


3

Le JsonParserconstructeur est obsolète. Utilisez plutôt la méthode statique:

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

2

A rencontré un scénario avec un tri à distance du magasin de données dans EXTJS 4.X où la chaîne est envoyée au serveur sous forme de tableau JSON (d'un seul objet).
Approche similaire à ce qui est présenté précédemment pour une chaîne simple, il suffit de convertir JsonArray avant JsonObject.

Chaîne du client: [{"property": "COLUMN_NAME", "direction": "ASC"}]

String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]";
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn);

String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString());
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString());

1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

Ci-dessus est le moyen le plus simple de convertir vos données de valeur-clé en objet gson.
Maddy

1
Merci, dans mon cas, j'avais une chaîne JSON non analysée à partir de laquelle je devais commencer.
7zark7
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.