Générer une classe Java à partir de JSON?


216

Dans un projet Java Maven, comment générer des fichiers source java à partir de JSON? Par exemple, nous avons

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

Lorsque nous courons, mvn generate-sourcesnous voulons qu'il génère quelque chose comme ceci:

class Address  {
    JSONObject mInternalJSONObject;

    Address (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getStreetAddress () {
        return mInternalJSONObject.getString("streetAddress");
    }

    String  getCity (){
        return mInternalJSONObject.getString("city");
    }
}

class Person {        
    JSONObject mInternalJSONObject;

    Person (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getFirstName () {
        return mInternalJSONObject.getString("firstName");
    }

    String  getLastName (){
        return mInternalJSONObject.getString("lastName");
    }

    Address getAddress (){
        return Address(mInternalJSONObject.getString("address"));
    }
}

En tant que développeur Java, quelles lignes de XML dois-je écrire dans mon pom.xmlpour que cela se produise?


J'ai mis à jour la question et la réponse pour les rendre sur le sujet. Veuillez rouvrir.
Alex R

Réponses:


270

Essayez le plug-in jsonschema2pojo :

        <plugin>
            <groupId>org.jsonschema2pojo</groupId>
            <artifactId>jsonschema2pojo-maven-plugin</artifactId>
            <version>1.0.2</version>
            <configuration>
                <sourceDirectory>${basedir}/src/main/resources/schemas</sourceDirectory>
                <targetPackage>com.myproject.jsonschemas</targetPackage>
                <sourceType>json</sourceType>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Le <sourceType>json</sourceType>couvre le cas où les sources sont json (comme l'OP). Si vous disposez de schémas json réels , supprimez cette ligne.

Mis à jour en 2020. Deux choses se sont produites depuis décembre 2009 lorsque cette question a été posée:

  • La spécification du schéma JSON a beaucoup évolué. Il est toujours en projet (non finalisé) mais il est en voie d'achèvement et est désormais un outil viable précisant vos règles structurelles

  • J'ai récemment lancé un nouveau projet open source spécifiquement destiné à résoudre votre problème: jsonschema2pojo . L'outil jsonschema2pojo prend un document de schéma json et génère des classes Java de style DTO (sous la forme de fichiers source .java). Le projet n'est pas encore arrivé à maturité mais couvre déjà les parties les plus utiles du schéma json. Je recherche plus de commentaires des utilisateurs pour aider à conduire le développement. À l'heure actuelle, vous pouvez utiliser l'outil à partir de la ligne de commande ou en tant que plugin Maven.

J'espère que cela t'aides!


4
Est-ce que quelqu'un qui a utilisé votre outil jsonschema2pojo ne devrait pas alors écrire son propre fichier de schéma? L'OP a demandé de commencer avec un fichier Json, pas un schéma. Existe-t-il un outil complémentaire pour passer de Json -> Schema? Je suppose qu'un tel outil, s'il existait, ne pouvait que fournir une supposition.
Jeff Axelrod

3
Depuis la version 0.3.3, vous pouvez utiliser le vieux JSON en entrée :)
joelittlejohn

14
... et il y a maintenant aussi un générateur en ligne: jsonschema2pojo.org
joelittlejohn

2
Excellent outil. Le lien fourni contient un outil en ligne où vous pouvez coller un exemple de JSON, cliquer sur un bouton et obtenir la source Java.
mbmast

1
@testerjoe Si vous voulez dire du code source Java, alors oui jsonschema2pojo le fait, et il est disponible en tant que plugin maven, tâche ant, extension gradle, outil CLI, bibliothèque java, etc ...
joelittlejohn

21

Si vous utilisez Jackson (la bibliothèque la plus populaire là-bas), essayez

https://github.com/astav/JsonToJava

Son open source et n'importe qui devrait pouvoir contribuer.

Résumé

Un générateur de fichier de classe source JsonToJava qui déduit le schéma en fonction des exemples de données json fournies et génère les structures de données java nécessaires.

Il encourage les équipes à réfléchir en Json d'abord, avant d'écrire du code réel.

Caractéristiques

  • Peut générer des classes pour une hiérarchie arbitrairement complexe (récursivement)
  • Peut lire vos classes Java existantes et s'il peut se désérialiser dans ces structures, le fera
  • Invitera l'utilisateur à entrer des cas ambigus

13

Voici un outil en ligne qui prendra JSON, y compris des objets imbriqués ou des tableaux d'objets imbriqués et générera une source Java avec des annotations Jackson.


1
Cela a très bien fonctionné pour moi du premier coup. J'avais profondément imbriqué JSON et cela a bien fonctionné, même si j'ai dû couper des portions redondantes pour obtenir une taille globale inférieure à 2k. M'a permis d'écrire: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); et les données résultantes ont parfaitement coulé. J'ai dû supprimer toutes ces notations Jackson, mais sinon cela a bien fonctionné pour gson. Je vous remercie.
noogrub

Merci, ça marche. Lorsque j'ai alimenté un JSON avec des champs sensibles à la casse, ce site a renvoyé un résultat, tandis que www.jsonschema2pojo.org a signalé une erreur.
CoolMind

6

Répondre à cette vieille question avec un projet récent ;-).

Pour le moment, la meilleure solution est probablement JsonSchema2Pojo :

Il fait le travail à partir du schéma Json rarement utilisé, mais aussi avec du Json ordinaire. Il fournit un plugin Ant et Maven et une application de test en ligne peut vous donner une idée de l'outil. J'ai mis un Tweet Json et généré toute la classe contenante (Tweet, User, Location, etc.).

Nous l'utiliserons sur le projet Agorava pour générer une cartographie des médias sociaux et suivre l'évolution du continent dans leur API.


C'est aussi mon impression, mais je n'ai pas encore essayé le plugin Maven, mais la version en ligne est assez lente et meurt pour autre chose que la classe Person habituelle ... Donc, pour une conversion en ligne rapide, l'outil de @ tim-boudreau a fonctionné le mieux pour moi.
Gregor

J'ai essayé JsonSchema2Pojo mais frapper le bouton Aperçu fait apparaître l'aperçu vierge.
AndroidDev

5

Merci à tous ceux qui ont essayé d'aider.
Pour moi, ce script a été utile. Il ne traite que du JSON plat et ne prend pas en charge les types, mais automatise certaines routines

  String str = 
        "{"
            + "'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':[]"
                + "}]" 
            + "}]"
        + "}";



    JSONObject json = new JSONObject(str);
    Iterator<String> iterator =  json.keys();

    System.out.println("Fields:");
    while (iterator.hasNext() ){
       System.out.println(String.format("public String %s;", iterator.next()));
    }

    System.out.println("public void Parse (String str){");
    System.out.println("JSONObject json = new JSONObject(str);");

    iterator  = json.keys();
    while (iterator.hasNext() ){
       String key = iterator.next();
       System.out.println(String.format("this.%s = json.getString(\"%s\");",key,key ));

    System.out.println("}");

5

Je sais que c'est une vieille question, mais je suis tombée dessus tout en essayant de trouver une réponse moi-même.

La réponse qui mentionne le générateur en ligne json-pojo (jsongen) est bonne, mais j'avais besoin de quelque chose que je pourrais exécuter sur la ligne de commande et modifier davantage.

J'ai donc écrit un script rubis très hacky pour prendre un exemple de fichier JSON et générer des POJO à partir de celui-ci. Il a un certain nombre de limitations (par exemple, il ne traite pas des champs qui correspondent aux mots clés réservés java) mais il en fait assez pour de nombreux cas.

Le code généré, par défaut, annote pour une utilisation avec Jackson, mais cela peut être désactivé avec un commutateur.

Vous pouvez trouver le code sur github: https://github.com/wotifgroup/json2pojo


2

Autant que je sache, il n'y a pas un tel outil. Encore.

La raison principale est, je suppose, que contrairement à XML (qui a un schéma XML, puis des outils comme 'xjc' pour faire ce que vous demandez, entre les définitions XML et POJO), il n'y a pas de langage de schéma entièrement fonctionnel. Il existe un schéma JSON, mais il prend très peu en charge les définitions de type réelles (se concentre sur les structures JSON), il serait donc difficile de générer des classes Java. Mais probablement toujours possible, esp. si certaines conventions de dénomination ont été définies et utilisées pour prendre en charge la génération.

Cependant: c'est quelque chose qui a été assez fréquemment demandé (sur les listes de diffusion des projets d'outils JSON que je suis), donc je pense que quelqu'un va écrire un tel outil dans un avenir proche.

Je ne pense donc pas que ce soit une mauvaise idée en soi (aussi: ce n'est pas une bonne idée pour tous les cas d'utilisation, cela dépend de ce que vous voulez faire).



2

Vous pouvez également essayer la bibliothèque GSON. Son assez puissant, il peut créer du JSON à partir de collections, d'objets personnalisés et fonctionne également vice versa. Il est publié sous Apache License 2.0 afin que vous puissiez également l'utiliser commercialement.

http://code.google.com/p/google-gson/


13
ne crée pas de définitions java
nécromancien

3
Ce n'est pas de cela qu'il s'agit
hop


0

Pour ajouter au message de @ japher. Si vous n'êtes pas particulièrement lié à JSON, les tampons de protocole méritent d'être vérifiés.


1
Les tampons de protocole ne sont même pas proches d'une réponse sur la façon de créer des objets Java à partir de JSON. À tout le moins, vous auriez dû recommander un outil pour créer des objets Java à partir de tampons de protocole.
james.garriss

0

Essayez ma solution

http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

{
    "auctionHouse": "sample string 1",
    "bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
    "bidPrice": 3,
    "bidPrice1": 3.1,
    "isYear":true
}

Résultat classe Java

private String  auctionHouse;
private Date  bidDate;
private int  bidPrice;
private double  bidPrice1;
private boolean  isYear;

JSONObject get

auctionHouse = obj.getString("auctionHouse");
bidDate = obj.opt("bidDate");
bidPrice = obj.getInt("bidPrice");
bidPrice1 = obj.getDouble("bidPrice1");
isYear = obj.getBoolean("isYear");

JSONObject put

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);

cette réponse semble si triviale. Il existe un moyen automatique de générer un pojo à partir de json
Rafael Ruiz Tabares

0

Permettez-moi de vous montrer comment développer l'outil. Vous pouvez le faire:

  1. fonction javascript de l'utilisateur Json.parse (), transforme une chaîne de type json en objet js
  2. puis utilisez cet objet pour générer le format javabean.
  3. quelque chose que vous devriez faire attention. (1) le mappage du type de valeur, par exemple, comment comprendre la chaîne, est le type de date. (2) loweser_case à camelCase

Je dev un outil pour résoudre le problème.il est bien conçu et plus rapide. obtenir le code de mon github .

profiter d'ici, je l'ai déployé sur le serveur web .

J'essaye la suggestion de la réponse du top 2. Un web ne peut pas s'ouvrir. Un est plus lent que mon outil. J'espère que vous apprécierez mon outil.


Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change.
Achrome
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.