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?

7zark7
la source
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();
Dallan Quass
la source
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();
Maverick
la source
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();
Purushotham
la source
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();
Jozef Benikovský
la source
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();
Dan Menes
la source
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.

Eduardo Chico
la source
3

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

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();
Stephen Paul
la source
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());
c2willi
la source
1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");
Maddy
la source
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