2013-07-22 46 views
10

Tôi đang sử dụng Gson để tuần tự hóa/deserialize đối tượng java thành json. Tôi muốn hiển thị nó trong UI và cần lược đồ để mô tả tốt hơn. Điều này sẽ cho phép tôi chỉnh sửa đối tượng và thêm nhiều dữ liệu hơn thực tế.
Có thể Gson cung cấp lược đồ json không?
Có khung nào khác có khả năng đó không?Tạo lược đồ JSON từ lớp Java

+0

Những gì bạn muốn hiển thị trong giao diện người dùng? Tôi thực sự không hiểu vấn đề là gì. 'gson' có thể chuyển đổi các lớp Java thành định dạng JSON, đó là những gì' gson' làm. – user1983983

Trả lời

21

Thư viện Gson có thể không chứa bất kỳ tính năng nào giống như vậy nhưng bạn có thể cố gắng giải quyết sự cố của mình với thư viện Jackson và mô-đun jackson-module-jsonSchema. Ví dụ, đối với các lớp học dưới đây:

class Entity { 

    private Long id; 
    private List<Profile> profiles; 

    // getters/setters 
} 

class Profile { 

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

chương trình này:

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

Prints dưới schema:

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

Bạn có 2 phím "loại" trong đối tượng "id"! Nó có đúng không? Bạn có thể giải thích dùm không? Cảm ơn – thermz

+0

Tôi không chắc chắn lý do tại sao chúng tôi có hai loại này. Tôi phải kiểm tra. Bạn có đầu ra tương tự trong trường hợp này không? Tại sao bạn cập nhật câu trả lời của tôi? Tôi đặt lược đồ mà tôi nhận được từ 'SchemaFactoryWrapper'. –

+0

Sau đó, đó là một sai lầm rất lớn !: tiêu chuẩn Lược đồ JSON chỉ định rằng một thuộc tính duy nhất có thể có ** nhiều ** loại, nhưng không theo cách này! Đó là đúng: * "type": ["number", "integer"] *. Có 2 khóa trong cùng một JSON chống lại mọi tiêu chuẩn! Các phím là duy nhất. Để biết thêm thông tin: http://www.jsonschema.net/ – thermz

6

Có xem xét dự án JSONschema4-mapper. Với thiết lập như sau:

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

bạn nhận được sau schema JSON cho các lớp học nêu tại Michal Ziober của 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

Thư viện tuyệt vời, chỉ muốn tôi sẽ làm việc với JDK 7 và không phải 8 làm đường cơ sở. Sẽ ghi nhớ điều này nếu chúng ta chuyển sang JDK8. – Joe

Các vấn đề liên quan