¿Generar clase Java desde JSON?

215

En un proyecto Java Maven, ¿cómo se generan archivos fuente java desde JSON? Por ejemplo tenemos

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

Cuando corremos mvn generate-sourcesqueremos que genere algo como esto:

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"));
    }
}

Como desarrollador de Java, ¿qué líneas de XML necesito escribir en mi pom.xmlpara que esto suceda?

Denis Palnitsky
fuente
He actualizado la pregunta y la respuesta para hacerlas sobre el tema. Por favor, vuelva a abrir.
Alex R

Respuestas:

269

Pruebe el complemento 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>

Los <sourceType>json</sourceType>cubre el caso en que las fuentes son json (como la OP). Si tiene esquemas json reales , elimine esta línea.

Actualizado en 2020. Han sucedido dos cosas desde diciembre de 2009 cuando se hizo esta pregunta:

  • La especificación del esquema JSON se ha movido mucho. Todavía está en borrador (no finalizado) pero está cerca de completarse y ahora es una herramienta viable que especifica sus reglas estructurales

  • Recientemente comencé un nuevo proyecto de código abierto destinado específicamente a resolver su problema: jsonschema2pojo . La herramienta jsonschema2pojo toma un documento de esquema json y genera clases Java de estilo DTO (en forma de archivos fuente .java). El proyecto aún no está maduro, pero ya proporciona cobertura de las partes más útiles del esquema json. Estoy buscando más comentarios de los usuarios para ayudar a impulsar el desarrollo. En este momento puede usar la herramienta desde la línea de comandos o como un complemento de Maven.

¡Espero que esto ayude!

joelittlejohn
fuente
44
¿Entonces alguien que usó su herramienta jsonschema2pojo tendría que escribir su propio archivo de esquema? El OP solicitó comenzar con un archivo Json, no con un esquema. ¿Hay una herramienta complementaria para ir de Json -> Esquema? Supongo que dicha herramienta, si existiera, solo podría proporcionar una suposición.
Jeff Axelrod
3
A partir de la versión 0.3.3, puede usar JSON antiguo como entrada :)
joelittlejohn
14
... y ahora también hay un generador en línea: jsonschema2pojo.org
joelittlejohn
2
Excelente herramienta El enlace suministrado contiene una herramienta en línea donde puede pegar una muestra JSON, hacer clic en un botón y obtener la fuente Java.
mbmast
1
@testerjoe Si se refiere a código fuente de Java, entonces sí jsonschema2pojo hace esto, y está disponible como un plug-in de Maven, la tarea de hormigas, la extensión Gradle, herramienta CLI, biblioteca java, etc ...
joelittlejohn
21

Si está utilizando Jackson (la biblioteca más popular allí), intente

https://github.com/astav/JsonToJava

Es de código abierto y cualquiera debería poder contribuir.

Resumen

Un generador de archivos de clase fuente JsonToJava que deduce el esquema en base a los datos json de muestra suministrados y genera las estructuras de datos java necesarias.

Alienta a los equipos a pensar primero en Json, antes de escribir el código real.

Caracteristicas

  • Puede generar clases para una jerarquía compleja arbitrariamente (recursivamente)
  • Puede leer sus clases Java existentes y si puede deserializarse en esas estructuras, lo hará
  • Solicitará la entrada del usuario cuando existan casos ambiguos
Astav
fuente
13

Aquí hay una herramienta en línea que tomará JSON, incluidos objetos anidados o matrices anidadas de objetos y generará una fuente Java con anotaciones Jackson.

Tim Boudreau
fuente
1
Esto funcionó muy bien para mí en el primer intento. Había anidado profundamente JSON y funcionó bien, aunque tuve que recortar porciones redundantes para obtener el tamaño total por debajo de 2k. Me permitió escribir: MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); y los datos resultantes fluyeron perfectamente. Tuve que eliminar todas esas anotaciones de Jackson, pero de lo contrario funcionó bien para gson. Gracias.
noogrub
Gracias funciona. Cuando introduje un JSON con campos que distinguen entre mayúsculas y minúsculas, este sitio arrojó un resultado, mientras que www.jsonschema2pojo.org informó un error.
CoolMind
6

Respondiendo esta vieja pregunta con un proyecto reciente ;-).

Por el momento, la mejor solución es probablemente JsonSchema2Pojo :

Hace el trabajo desde el esquema Json raramente usado, pero también con Json simple. Proporciona el complemento Ant and Maven y una aplicación de prueba en línea puede darle una idea de la herramienta. Puse un Json Tweet y generé toda la clase que contiene (Tweet, Usuario, Ubicación, etc.).

Lo usaremos en el proyecto Agorava para generar mapeo de redes sociales y seguir la evolución del contenido en su API.

Antoine Sabot-Durand
fuente
Esa también es mi impresión, pero aún no probé el complemento Maven, sin embargo, la versión en línea es bastante lenta y muere por algo que no sea la clase de persona habitual ... Entonces, para una conversión rápida en línea, la herramienta de @ tim-boudreau funcionó mejor para yo.
Gregor
Intenté JsonSchema2Pojo pero al presionar el botón Vista previa aparece la vista previa en blanco.
AndroidDev
5

Gracias a todos los que intentaron ayudar.
Para mí, este script fue útil. Solo procesa JSON plano y no se ocupa de los tipos, sino que automatiza algunas rutinas

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

Soy consciente de que esta es una vieja pregunta, pero me la encontré mientras trataba de encontrar una respuesta.

La respuesta que menciona el generador json-pojo en línea (jsongen) es buena, pero necesitaba algo que pudiera ejecutar en la línea de comando y ajustar más.

Así que escribí un script ruby ​​muy hacky para tomar un archivo JSON de muestra y generar POJO a partir de él. Tiene una serie de limitaciones (por ejemplo, no trata con campos que coinciden con palabras clave reservadas de Java) pero hace lo suficiente para muchos casos.

El código generado, por defecto, se anota para su uso con Jackson, pero esto se puede desactivar con un interruptor.

Puede encontrar el código en github: https://github.com/wotifgroup/json2pojo

Chris R
fuente
2

Que yo sepa, no existe tal herramienta. Todavía.

Sospecho que la razón principal es que, a diferencia de XML (que tiene un esquema XML, y luego herramientas como 'xjc' para hacer lo que pides, entre las definiciones XML y POJO), no existe un lenguaje de esquema con todas las características. Existe el esquema JSON, pero tiene muy poco soporte para las definiciones de tipo reales (se centra en las estructuras JSON), por lo que sería complicado generar clases Java. Pero probablemente aún sea posible, especialmente. si se definieron algunas convenciones de nomenclatura y se utilizaron para admitir la generación.

Sin embargo: esto es algo que se ha solicitado con bastante frecuencia (en las listas de correo de los proyectos de herramientas JSON que sigo), por lo que creo que alguien escribirá dicha herramienta en un futuro próximo.

Por lo tanto, no creo que sea una mala idea per se (también: no es una buena idea para todos los casos de uso, depende de lo que quieras hacer).

StaxMan
fuente
2

También puedes probar la biblioteca GSON. Es bastante potente, puede crear JSON a partir de colecciones, objetos personalizados y funciona también viceversa. Se lanzó bajo la licencia Apache 2.0 para que pueda usarlo también comercialmente.

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

MB.One
fuente
13
no crea definiciones de Java
nigromante
3
Esto no es lo que la pregunta es sobre
hop
0

Para agregar a la publicación de @ japher. Si no está particularmente vinculado a JSON, vale la pena echarle un vistazo a Protocol Buffers .

dgorissen
fuente
1
Protocol Buffers ni siquiera está cerca de una respuesta sobre cómo crear objetos Java desde JSON. Como mínimo, debería haber recomendado una herramienta para crear objetos Java a partir de búferes de protocolo.
james.garriss
0

Prueba mi solución

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
}

Resultado Java Class

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 puesto

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);
Foobnix
fuente
Esta respuesta parece tan trivial. Hay una forma automática de generar pojo de json
Rafael Ruiz Tabares
0

Déjame mostrarte cómo desarrollar la herramienta. Puedes hacerlo:

  1. función de javascript del usuario Json.parse (), crea una cadena como-json trans a objeto js
  2. luego use este objeto para generar el formato javabean.
  3. algo, debería importarle. (1) asignación de tipo de valor, por ejemplo, cómo calcular la cadena, es tipo de fecha. (2) loweser_case a camelCase

Dev una herramienta para resolver el problema. Está bien diseñado y más rápido. obtener el código de mi github .

disfrútenlo desde aquí, lo he implementado en el servidor web .

Intento la sugerencia de las 2 respuestas principales. Una web no se puede abrir. Una es más lenta que mi herramienta. Espero que disfruten de mi herramienta.

lizeyang
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia.
Achrome