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
Odpowiedz
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"
}
}
}
}
}
}
Masz 2 klucze "typu" w obiekcie "id"! Czy to jest poprawne? Czy możesz wyjaśnić? Dzięki – thermz
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'. –
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
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"}
}
}
Ś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
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