2013-07-22 10 views
10

Ich verwende zu serialisieren/deserialize Java-Objekte zu JSON. Ich möchte es in anzeigen und benötigt ein Schema, um eine bessere Beschreibung zu machen. Dadurch kann ich Objekte bearbeiten und mehr Daten hinzufügen, als sie tatsächlich sind.
Kann JSON-Schema zur Verfügung stellen?
Hat ein anderes Framework diese Fähigkeit?Erstellen Sie JSON-Schema von Java-Klasse

+0

Was möchten Sie in UI angezeigt werden? Ich verstehe nicht wirklich, was das Problem ist. 'gson' kann Java-Klassen in JSON-Format konvertieren, das ist' gson'. – user1983983

Antwort

21

Gson Bibliothek enthält wahrscheinlich keine Funktion wie diese, aber Sie können versuchen, Ihr Problem mit Jackson Bibliothek und jackson-module-jsonSchema Modul zu lösen. Zum Beispiel für unter Klassen:

class Entity { 

    private Long id; 
    private List<Profile> profiles; 

    // getters/setters 
} 

class Profile { 

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

dieses Programm:

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

Drucke unter Schema:

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

Sie haben 2 "type" Schlüssel in "id" -Objekt! Ist es richtig? Kannst du bitte Erklären? Danke – thermz

+0

Ich bin nicht sicher, warum wir diese zwei Arten haben. Ich muss überprüfen. Hast du in diesem Fall die gleiche Ausgabe? Warum hast du meine Antwort aktualisiert? Ich stelle ein Schema, das ich von 'SchemaFactoryWrapper' erhalten habe. –

+0

Dann ist das ein großer Fehler !: der JSON-Schema-Standard spezifiziert, dass eine einzelne Eigenschaft ** mehrere ** Typen haben kann, aber nicht auf diese Weise! Das ist die richtige: * "type": ["number", "integer"] *. Mit 2 Schlüsseln im selben JSON ist gegen jeden Standard! Schlüssel sind einzigartig. Für weitere Informationen: http://www.jsonschema.net/ – thermz

6

Hier finden Sie aktuelle JSONschema4-mapper Projekt. Mit folgenden Setup:

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

Sie erhalten folgende JSON Schema für die Klassen in Michal Ziober des erwähnten 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

Große Bibliothek, wünschte nur, ich würde mit JDK 7 und nicht 8 als Basis arbeiten. Denken wir daran, sollten wir jemals zu JDK8 wechseln. – Joe

Verwandte Themen