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


Je veux un utilitaire qui génère des fichiers source java à 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.

Author: Verhagen, 2009-12-24

14 answers

Essayer:

Http://www.jsonschema2pojo.org

Orsol, je suis sûr que vous n'attendez pas encore une solution ici, mais pour le bien de la prochaine personne qui trouve ce fil, j'ai pensé ajouter plus d'informations.

Deux choses se sont produites depuis décembre 09 lorsque cette question a été posée:

  • La spécification de schéma JSON a beaucoup évolué. Il est toujours en projet (pas finalisé) mais il est proche de l'achèvement et est maintenant un outil viable spécifiant votre les 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 .les fichiers source java). Le projet n'est pas encore mature mais fournit déjà une couverture des parties les plus utiles du schéma json. Je cherche plus de commentaires des utilisateurs pour aider à conduire le développement. Maintenant, vous pouvez utiliser l'outil de la ligne de commande ou comme un plugin Maven.

J'espère que cela aide!

 224
Author: joelittlejohn, 2014-03-05 20:40:56

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

Https://github.com/astav/JsonToJava

Son open source et tout le monde devrait être en mesure de contribuer.

Résumé

Un générateur de fichiers 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 java nécessaires.

Il encourage les équipes à penser en Json d'abord, avant d'écrire réel 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 dans ces structures, le fera
  • Invite l'utilisateur à entrer lorsqu'il existe des cas ambigus
 17
Author: Astav, 2017-05-30 07:51:34

Il ne semble pas que JSON Gen (la réponse acceptée) ait été mis à jour depuis un moment. http://javafromjson.dashingrocket.com semble bien, bien que

 12
Author: jessebs, 2014-04-27 19:02:42

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

 11
Author: Tim Boudreau, 2015-02-07 02:23:07

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

À l'instant la meilleure solution est probablement JsonSchema2Pojo :

Il fait le travail à partir du schéma Json rarement utilisé mais aussi avec du Json simple. 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 contenant (Tweet, Utilisateur, Emplacement, etc..).

Nous allons l'utiliser sur Agorava projet pour générer Cartographie des médias sociaux et suivez l'évolution de contant dans leur API.

 6
Author: Antoine Sabot-Durand, 2014-06-24 22:40:39

Merci à tous ceux qui ont tenté d'aider.
Pour moi, ce script a été utile. Il ne traite que du JSON plat et ne s'occupe pas des types, mais automatise une 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
Author: Denis Palnitsky, 2009-12-25 09:23:21

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

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

J'ai donc écrit un script ruby très hacky pour prendre un exemple de fichier JSON et en générer des POJOs. Il a un certain nombre de limitations (par exemple, il ne traite pas des champs qui correspondent à des 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

 4
Author: Chris R, 2011-12-21 05:25:20

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

La raison principale est, je soupçonne, 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 encore possible, esp. si certaines conventions de nommage ont été définies et utilisé pour soutenir la production.

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 écrira un tel outil dans un avenir proche.

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

 2
Author: StaxMan, 2010-01-10 23:24:57

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

Https://github.com/BrunoAlexandreMendesMartins/CleverModels

Il prend en charge, JAVA, C# et Objective-c à partir de JSON .

N'hésitez pas à contribuer!

 2
Author: bmartins, 2012-06-19 12:38:45

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

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

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

L'API TMS de Gracenote:

Https://github.com/inder123/gracenote-java-api

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

 1
Author: inder, 2015-03-14 19:34:03

À ajouter au post de @japher. Si vous n'êtes pas particulièrement lié à JSON, Protocol Buffers vaut la peine d'être vérifié.

 0
Author: dgorissen, 2011-02-23 14:08:53

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

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

 0
Author: MB.One, 2012-10-18 08:40:20

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

  1. fonction javascript utilisateur Json.parse(),faire une chaîne comme-json trans à l'objet js
  2. ensuite, utilisez cet objet pour genrer le format javabean.
  3. quelque chose,vous shoud soins.(1)le mappage de type de valeur,par exemple,comment comprendre la chaîne,est le type de date.(2) loweser_case à CamelCase

Je dev un outil résoudre le problem.it est bien conception et rapide plus. obtenir le code de mon github.

Profitez-en de là, je l'ai déployé sur webserver .

J'essaie la suggestion de la réponse top 2.un web est ne peut pas ouvrir.l'un est plus lent que mon outil.j'espère que vous apprécierez mon outil.

 0
Author: lizeyang, 2015-06-18 06:31:10

Essayer 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 De La Classe Java

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

JSONObject obtenir

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

JSONObject mettre

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);
 -1
Author: Foobnix, 2014-11-05 12:11:45