2013-07-22 15 views
10

Sto usando Gson per serializzare/deserializzare oggetti java su json. Voglio visualizzarlo in UI e ha bisogno di uno schema per fare una descrizione migliore. Questo mi permetterà di modificare oggetti e aggiungere più dati di quanti ce ne siano realmente.
Can Gson fornisce lo schema JSON?
Qualche altro framework ha questa capacità?Creazione schema JSON dalla classe Java

+0

Vorresti visualizzare nell'interfaccia utente? Non capisco davvero quale sia il problema. 'gson' può convertire le classi Java in formato JSON, questo è ciò che' gson' fa. – user1983983

risposta

21

Probabilmente la libreria Gson non contiene alcuna funzione del genere, ma puoi provare a risolvere il problema con la libreria Jackson e il modulo jackson-module-jsonSchema. Ad esempio, per le classi inferiori:

class Entity { 

    private Long id; 
    private List<Profile> profiles; 

    // getters/setters 
} 

class Profile { 

    private String name; 
    private String value; 
    // getters/setters 
} 

questo programma:

import java.io.IOException; 
import java.util.List; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.module.jsonSchema.JsonSchema; 
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper; 

public class JacksonProgram { 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 
     mapper.acceptJsonFormatVisitor(Entity.class, visitor); 
     JsonSchema schema = visitor.finalSchema(); 
     System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema)); 
    } 
} 

Stampe di sotto dello schema:

{ 
    "type" : "object", 
    "properties" : { 
    "id" : { 
     "type" : "integer" 
    }, 
    "profiles" : { 
     "type" : "array", 
     "items" : { 
     "type" : "object", 
     "properties" : { 
      "name" : { 
      "type" : "string" 
      }, 
      "value" : { 
      "type" : "string" 
      } 
     } 
     } 
    } 
    } 
} 
+0

Hai 2 chiavi "tipo" nell'oggetto "id"! È corretto? Puoi spiegare per favore? Grazie – thermz

+0

Non sono sicuro del motivo per cui abbiamo questi due tipi. Devo controllare. Hai l'output simile in questo caso? Perché hai aggiornato la mia risposta? Ho messo lo schema che ho ricevuto da 'SchemaFactoryWrapper'. –

+0

Quindi questo è un errore enorme !: lo standard JSON Schema specifica che una singola proprietà può avere ** tipi ** multipli, ma non in questo modo! Quello è corretto: * "tipo": ["numero", "intero"] *. Avere 2 chiavi nello stesso JSON è contro ogni standard! Le chiavi sono uniche. Per maggiori informazioni: http://www.jsonschema.net/ – thermz

6

Dai un'occhiata alla JSONschema4-mapper progetto. Con seguente configurazione:

SchemaMapper schemaMapper = new SchemaMapper(); 
JSONObject jsonObject = schemaMapper.toJsonSchema4(Entity.class, true); 
System.out.println(jsonObject.toString(4)); 

si ottiene seguente schema JSON per le classi di cui Michal Ziober di answer to this question:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "additionalProperties": false, 
    "type": "object", 
    "definitions": { 
     "Profile": { 
      "additionalProperties": false, 
      "type": "object", 
      "properties": { 
       "name": {"type": "string"}, 
       "value": {"type": "string"} 
      } 
     }, 
     "long": { 
      "maximum": 9223372036854775807, 
      "type": "integer", 
      "minimum": -9223372036854775808 
     } 
    }, 
    "properties": { 
     "profiles": { 
      "type": "array", 
      "items": {"$ref": "#/definitions/Profile"} 
     }, 
     "id": {"$ref": "#/definitions/long"} 
    } 
} 
+0

Grande biblioteca, vorrei solo lavorare con JDK 7 e non 8 come base. Tienilo a mente se dovessimo mai passare a JDK8. – Joe