2013-07-22 8 views
10

Gsonを使用して、javaオブジェクトをjsonにシリアル化/逆シリアル化しています。私はそれをUIに表示したいと考えており、より良い説明をするためにはスキーマが必要です。これにより、オブジェクトを編集し、実際に存在するよりも多くのデータを追加することができます。
Gsonはjsonスキーマを提供できますか?
他のフレームワークにはその機能がありますか?JavaクラスからJSONスキーマを作成する

+0

何がUIに表示したいですか?私は本当に問題が何かを得ることはありません。 '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

"id"オブジェクトに2つの "タイプ"キーがあります!それが正しいか?説明していただけますか?ありがとう – thermz

+0

私はなぜこれら2つのタイプがあるのか​​分かりません。私は確認する必要があります。この場合も同様の出力がありますか?なぜ私の答えを更新したのですか?私は 'SchemaFactoryWrapper'から受け取ったスキーマを置いています。 –

+0

それは巨大な間違いです!JSON Schema標準では、単一のプロパティに**複数の**タイプを持たせることができますが、このようにはできません。それは正しいものです:* "type":["number"、 "integer"] *。 同じJSONに2つのキーがあることは、すべての標準に違反しています!キーはユニークです。詳細については、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)); 

あなたはミハルZioberのanswer to this questionで述べたクラスのためにJSONスキーマを以下の取得:

{ 
    "$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

関連する問題