¿Generar clase Java desde JSON?

Resuelto Denis Palnitsky asked hace 14 años • 0 respuestas

En un proyecto Java Maven, ¿cómo se generan archivos fuente Java a partir de JSON? Por ejemplo tenemos

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

Cuando lo ejecutamos 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 pom.xmlpara que esto suceda?

Denis Palnitsky avatar Dec 24 '09 15:12 Denis Palnitsky
Aceptado

Pruebe http://www.jsonschema2pojo.org

O el complemento jsonschema2pojo para Maven:

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

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

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

  • La especificación del esquema JSON ha avanzado 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. Ahora puedes utilizar la herramienta desde la línea de comandos o como complemento de Maven.

joelittlejohn avatar Dec 18 '2010 23:12 joelittlejohn

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

https://github.com/astav/JsonToJava

Es de código abierto (actualizado por última vez el 7 de junio de 2013 a partir del año 2021) y cualquiera debería poder contribuir.

Resumen

Un generador de archivos de clase fuente JsonToJava que deduce el esquema basándose en los datos json de muestra proporcionados y genera las estructuras de datos Java necesarias.

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

Características

  • Puede generar clases para una jerarquía arbitrariamente compleja (recursivamente)
  • Puede leer sus clases Java existentes y, si puede deserializarlas en esas estructuras, lo hará
  • Solicitará la entrada del usuario cuando existan casos ambiguos
Astav avatar Oct 25 '2012 14:10 Astav

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

Tim Boudreau avatar Feb 07 '2015 02:02 Tim Boudreau

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

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

Hace el trabajo con el esquema Json rara vez utilizado pero también con Json simple. Proporciona complementos Ant y Maven y una aplicación de prueba en línea puede darle una idea de la herramienta. Puse un Tweet Json y generé todas las clases que lo contienen (Tweet, Usuario, Ubicación, etc.).

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

Antoine Sabot-Durand avatar Oct 18 '2012 08:10 Antoine Sabot-Durand

Gracias a todos los que intentaron ayudar.
Para mí este script fue útil. Procesa solo JSON plano y no se ocupa de los tipos, pero 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 avatar Dec 25 '2009 09:12 Denis Palnitsky