291 votes

Convertir des données JSON en objet Java

Je veux pouvoir accéder aux propriétés d'une chaîne JSON dans ma méthode d'action Java. La chaîne est disponible en disant simplement myJsonString = object.getJson() . Vous trouverez ci-dessous un exemple de ce à quoi peut ressembler la chaîne de caractères :

{
    'title': 'ComputingandInformationsystems',
    'id': 1,
    'children': 'true',
    'groups': [{
        'title': 'LeveloneCIS',
        'id': 2,
        'children': 'true',
        'groups': [{
            'title': 'IntroToComputingandInternet',
            'id': 3,
            'children': 'false',
            'groups': []
        }]
    }]
}

Dans cette chaîne, chaque objet JSON contient un tableau d'autres objets JSON. L'intention est d'extraire une liste d'identifiants où tout objet donné possédant une propriété de groupe qui contient d'autres objets JSON. J'ai regardé Gson de Google comme un plugin JSON potentiel. Quelqu'un peut-il me donner des conseils sur la manière de générer Java à partir de cette chaîne JSON ?

0 votes

0 votes

360voto

BalusC Points 498232

J'ai regardé Gson de Google comme un plugin JSON potentiel. Quelqu'un peut-il me donner des conseils sur la manière de générer Java à partir de cette chaîne JSON ?

Google Gson supporte les génériques et les beans imbriqués. Le site [] en JSON représente un tableau et devrait correspondre à une collection Java telle que List ou simplement un simple tableau Java. Le site {} en JSON représente un objet et doit correspondre à un code Java Map ou simplement une classe JavaBean.

Vous disposez d'un objet JSON avec plusieurs propriétés dont la propriété groups représente un tableau d'objets imbriqués du même type. Ceci peut être analysé avec Gson de la manière suivante :

package com.stackoverflow.q1688099;

import java.util.List;
import com.google.gson.Gson;

public class Test {

    public static void main(String... args) throws Exception {
        String json = 
            "{"
                + "'title': 'Computing and Information systems',"
                + "'id' : 1,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Level one CIS',"
                    + "'id' : 2,"
                    + "'children' : 'true',"
                    + "'groups' : [{"
                        + "'title' : 'Intro To Computing and Internet',"
                        + "'id' : 3,"
                        + "'children': 'false',"
                        + "'groups':[]"
                    + "}]" 
                + "}]"
            + "}";

        // Now do the magic.
        Data data = new Gson().fromJson(json, Data.class);

        // Show it.
        System.out.println(data);
    }

}

class Data {
    private String title;
    private Long id;
    private Boolean children;
    private List<Data> groups;

    public String getTitle() { return title; }
    public Long getId() { return id; }
    public Boolean getChildren() { return children; }
    public List<Data> getGroups() { return groups; }

    public void setTitle(String title) { this.title = title; }
    public void setId(Long id) { this.id = id; }
    public void setChildren(Boolean children) { this.children = children; }
    public void setGroups(List<Data> groups) { this.groups = groups; }

    public String toString() {
        return String.format("title:%s,id:%d,children:%s,groups:%s", title, id, children, groups);
    }
}

C'est assez simple, n'est-ce pas ? Il suffit d'avoir un JavaBean approprié et d'appeler Gson#fromJson() .

Voir aussi :

0 votes

Merci BalusC, j'ai utilisé Gson et le concept est assez simple à comprendre.

4 votes

Performant ? L'avez-vous réellement mesuré ? Bien que GSON ait un ensemble de fonctionnalités raisonnables, je pensais que les performances étaient un point faible (selon [ [cowtowncoder.com/blog/archives/2009/09/entry_326.html]](http://www.cowtowncoder.com/blog/archives/2009/09/entry_326.html]) ) Pour l'exemple : Je pensais que GSON n'avait pas vraiment besoin de setters, et qu'il était basé sur des champs. Le code pourrait donc être légèrement simplifié.

3 votes

Je l'utilise dans une application Android. Ce n'est pas la solution la plus rapide possible mais elle est assez simple à programmer pour justifier le manque de performance pour l'utilisateur jusqu'à présent. Peut-être que dans une version ultérieure de l'application, elle sera supprimée au profit d'une solution plus rapide.

49voto

Jor Points 331

Bewaaaaare de Gson ! C'est très cool, très bien, mais à la seconde où vous voulez faire autre chose que des objets simples, vous pourriez facilement avoir besoin de commencer à construire vos propres sérialiseurs (ce qui n'est pas le cas). que dur).

De plus, si vous avez un tableau d'objets, et que vous désérialisez du json dans ce tableau d'objets, les vrais types sont PERDUS ! Les objets complets ne seront même pas copiés ! Utilisez XStream qui, si vous utilisez le pilote jsondriver et définissez les paramètres appropriés, codera les types laids dans le json réel, de sorte que vous ne perdez rien. Un petit prix à payer (json moche) pour une vraie sérialisation.

Notez que Jackson corrige ces problèmes, et est plus rapide que le GSON.

2 votes

J'ai écrit un fork de Gson qui corrige ces problèmes (et évite toutes les annotations de Jackson) : github.com/winterstein/flexi-gson

27voto

StaxMan Points 34626

Curieusement, le seul processeur JSON décent mentionné jusqu'à présent est GSON.

Voici d'autres bons choix :

  • Jackson ( Github ) -- liaison de données puissante (JSON vers/depuis POJO), streaming (ultra rapide), modèle arborescent (pratique pour les accès non typés).
  • Flex-JSON -- sérialisation hautement configurable

EDIT (août/2013) :

Un autre élément à prendre en compte :

  • Genson -- fonctionnalité similaire à Jackson, visant à être plus facile à configurer par le développeur

22voto

Gene De Lisa Points 708

Ou avec Jackson :

String json = "...";
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});

2 votes

Cela donnera l'erreur "can not deserialize instance of java.util.HashSet out of START_OBJECT token".

12voto

Dave Points 2958

La bibliothèque XStream prend également en charge JSON : http://xstream.codehaus.org/json-tutorial.html .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X