¿Generar clase Java desde JSON?
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-sources
queremos 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.xml
para que esto suceda?
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.
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
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.
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.
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("}");