web-dev-qa-db-fra.com

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

Je veux un utilitaire qui génère Java fichiers source à partir de JSON. Par exemple nous avons

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

Nous passons ceci à l'utilitaire et nous 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"));
    }
}

Pas si difficile à écrire, mais je suis sûr que quelqu'un l'a déjà fait.

200
Denis Palnitsky

Essayer:

http://www.jsonschema2pojo.org

Orsol, je suis sûr que vous n'attendez toujours pas de solution, mais par souci de la prochaine personne qui trouve ce fil, j'ai pensé ajouter quelques informations supplémentaires.

Deux choses se sont passées depuis le mois de décembre 2009, lorsque cette question a été posée:

  • JSON Schema spec a beaucoup évolué. Il est toujours en projet (non finalisé) mais il est presque terminé et constitue désormais un outil viable spécifiant 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 sources .Java). Le projet n’est pas encore au point mais il couvre déjà les parties les plus utiles du schéma json. Je cherche 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 plug-in Maven.

J'espère que cela t'aides!

252
joelittlejohn

Si vous utilisez Jackson (la bibliothèque la plus populaire du pays), essayez

https://github.com/astav/JsonToJava

Son source ouverte et tout le monde 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 fournis et génère les structures de données nécessaires Java.

Cela encourage les équipes à penser à Json avant d’écrire du code.

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 désérialiser ces structures, le fera
  • Invitera-t-il les utilisateurs à saisir des cas ambigus?
20
Astav

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

12
Tim Boudreau

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 Json brut. Il fournit les plugins Ant et Maven et un 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, Utilisateur, Emplacement, etc.).

Nous l'utilisons sur le projet Agorava pour générer un mappage des médias sociaux et suivre l'évolution constante de leur API.

6

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

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 très compliqué Ruby pour extraire un exemple de fichier JSON et en générer des POJO. Il comporte un certain nombre de limitations (par exemple, il ne traite pas les champs qui correspondent aux mots clés réservés Java), mais il en fait assez dans de nombreux cas.

Le code généré par défaut est annoté pour être utilisé avec Jackson, mais cela peut être désactivé avec un commutateur.

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

5
Chris R

Merci à tous ceux qui ont essayé d'aider.
Pour moi, ce script a été utile. Il traite uniquement les fichiers JSON à plat et ne prend pas en charge les types, mais automatise certaines tâches de routine.

  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("}");
4
Denis Palnitsky

Pour autant que je sache, un tel outil n'existe pas. Encore.

Je suppose que la principale raison est que, contrairement à XML (qui a un schéma XML, puis des outils tels que 'xjc' pour faire ce que vous demandez, entre les définitions XML et POJO), il n’existe pas de langage de schéma à fonctionnalités complètes. Il existe un schéma JSON, mais il prend très peu en charge les définitions de type réelles (il se concentre sur les structures JSON). Il serait donc difficile de générer des classes Java. Mais probablement encore 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), je pense donc que quelqu'un écrira un tel outil dans un proche avenir.

Donc, je ne pense 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
StaxMan

J'ai eu le même problème alors j'ai décidé de commencer à écrire un petit outil pour m'aider avec cela. Je vais partager andopen source il.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Il supporte, Java, C # et Objective-C de JSON.

N'hésitez pas à contribuer!

2
ehanoc

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

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

2
MB.One

J'ai créé un projet github Json2Java qui fait cela. https://github.com/inder123/json2Java

Json2Java fournit des personnalisations telles que le changement de nom de champs et la création de hiérarchies d'héritage.

J'ai utilisé l'outil pour créer des API relativement complexes:

API TMS de Gracenote: https://github.com/inder123/gracenote-Java-api

API de géocodage de Google Maps: https://github.com/inder123/geocoding

1
inder

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 Java Classe

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);
0
Foobnix

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

  1. fonction javascript utilisateur Json.parse (), transforme une chaîne comme-json en objet js
  2. utilisez ensuite cet objet pour générer le format javabean.
  3. (1) le mappage du type de valeur, par exemple, comment déterminer la chaîne, est le type de date (2) loweser_case to camelCase

Je dev un outil résoudre le problème.il est bien design et rapide plus. récupère le code de mon github .

profiter à partir d'ici, je l'ai déployer sur webserver .

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

0
lizeyang

Ajouter au message de @ japher. Si vous n'êtes pas particulièrement lié au JSON, tampons de protocole vaut la peine d'être vérifié.

0
dgorissen