2013-07-22 24 views
10

Używam Gson do serializowania/deserializowania obiektów java do json. Chcę go wyświetlić w wersji UI i wymaga schematu, aby uzyskać lepszy opis. To pozwoli mi edytować obiekty i dodawać więcej danych, niż jest w rzeczywistości.
Czy Gson może dostarczyć schematu json?
Czy inna struktura ma taką możliwość?Tworzenie schematu JSON z klasy Java

+0

Co chcesz wyświetlać w interfejsie? Naprawdę nie rozumiem, jaki jest problem. 'gson' potrafi konwertować Java-Classes do formatu JSON, tak właśnie robi' gson'. – user1983983

Odpowiedz

21

Biblioteka Gson prawdopodobnie nie zawiera żadnej takiej funkcji, ale można spróbować rozwiązać problem z biblioteką Jackson i jackson-module-jsonSchema. Na przykład, dla poniższych klas:

class Entity { 

    private Long id; 
    private List<Profile> profiles; 

    // getters/setters 
} 

class Profile { 

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

tego programu:

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

Wydruki poniżej schematu:

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

Masz 2 klucze "typu" w obiekcie "id"! Czy to jest poprawne? Czy możesz wyjaśnić? Dzięki – thermz

+0

Nie jestem pewien, dlaczego mamy te dwa typy. Muszę sprawdzić. Czy masz podobny wynik w tym przypadku? Dlaczego zaktualizowałeś moją odpowiedź? Wprowadziłem schemat, który otrzymałem od 'SchemaFactoryWrapper'. –

+0

To jest wielki błąd !: Standard JSON Schema określa, że ​​pojedyncza właściwość może mieć ** wiele ** typów, ale nie w ten sposób! To jest poprawna: * "type": ["number", "integer"] *. Posiadanie 2 kluczy w tym samym JSON jest sprzeczne z każdym standardem! Klucze są unikalne. Aby uzyskać więcej informacji: http://www.jsonschema.net/ – thermz

6

Wystarczy popatrzeć na JSONschema4-mapper projektu. O następującej konfiguracji:

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

Ci następujący schemat JSON dla klas wymienionych w Michał Ziober na 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

Świetna biblioteka, chcę tylko pracować z JDK 7, a nie 8 jako podstawową. Będziemy o tym pamiętać, jeśli kiedykolwiek przejdziemy do JDK8. – Joe

Powiązane problemy