2013-07-22 3 views
10

Я использую Gson для сериализации/десериализации java-объектов для json. Я хочу отобразить его в UI и нужна схема, чтобы сделать лучшее описание. Это позволит мне редактировать объекты и добавлять больше данных, чем есть на самом деле.
Может ли Gson предоставить схему json?
Имеет ли какая-либо другая инфраструктура такая возможность?Создайте схему JSON из класса Java

+0

Что бы вы хотели отобразить в интерфейсе? Я действительно не понимаю, в чем проблема. 'gson' может преобразовывать Java-классы в JSON-формат, вот что делает' gson'. – user1983983

ответ

21

В библиотеке Gson, вероятно, нет таких возможностей, но вы можете попробовать решить проблему с помощью библиотеки Jackson и модуля jackson-module-jsonSchema. Например, для ниже классов:

class Entity { 

    private Long id; 
    private List<Profile> profiles; 

    // getters/setters 
} 

class Profile { 

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

эту программу:

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

Отпечатки ниже схеме:

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

У вас есть клавиши типа «2» в объекте «id»! Правильно ли это? Не могли бы вы объяснить? Спасибо – thermz

+0

Я не уверен, почему у нас эти два типа. Я должен проверить. У вас есть аналогичный результат в этом случае? Почему вы обновили мой ответ? Я поместил схему, которую я получил от «SchemaFactoryWrapper». –

+0

Тогда это огромная ошибка! В стандарте JSON Schema указывается, что одно свойство может иметь ** несколько типов **, но не таким образом! Это правильный: * "type": ["number", "integer"] *. Имея 2 ключа в одном JSON против каждого стандарта! Ключи уникальны. Для получения дополнительной информации: http://www.jsonschema.net/ – thermz

6

Посмотрите JSONschema4-mapper проекта. При следующей установке:

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

вы получаете следующие JSON-схемы для классов, указанных в Michal Ziober-х 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

Отличная библиотека, просто хочу, чтобы я работал с JDK 7, а не 8 в качестве базовой линии. Помните об этом, если мы когда-нибудь перейдем к JDK8. – Joe

Смежные вопросы