2015-01-09 10 views
9

मैं क्या है:एक मोड़ के साथ POJO से Json स्कीमा उत्पन्न

मैं एक POJO से एक JSON स्कीमा पैदा कर रहा हूँ। स्कीमा उत्पन्न करने के लिए मेरा कोड ऐसा लगता है:

ObjectMapper mapper = new ObjectMapper(); 
TitleSchemaFactoryWrapper visitor = new TitleSchemaFactoryWrapper(); 
mapper.acceptJsonFormatVisitor(clazz, visitor); 
JsonSchema schema = visitor.finalSchema(); 
schemas.put(clazz, mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema)); 

मैं उपरोक्त कोड के माध्यम से कई स्कीमा उत्पन्न कर रहा हूं। POJOs में से एक तो की तरह, संभावित मान सीमित करने के लिए एक आंतरिक एम्बेडेड enum है:

public class MyClass { 

    @JsonProperty("name") 
    private String name; 
    @JsonProperty("startDayOfWeek") 
    private MyClass.StartDayOfWeek startDayOfWeek; 
    /** 
    * The ID of a timezone returned by the timezones route. 
    * 
    */ 
    @JsonProperty("timezone") 
    private String timezone; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    /** 
    * 
    * @return 
    *  The startDayOfWeek 
    */ 
    @JsonProperty("startDayOfWeek") 
    public MyClass.StartDayOfWeek getStartDayOfWeek() { 
     return startDayOfWeek; 
    } 

    /** 
    * 
    * @param startDayOfWeek 
    *  The startDayOfWeek 
    */ 
    @JsonProperty("startDayOfWeek") 
    public void setStartDayOfWeek(MyClass.StartDayOfWeek startDayOfWeek) { 
     this.startDayOfWeek = startDayOfWeek; 
    } 

    public static enum StartDayOfWeek { 

     MONDAY("Monday"), 
     TUESDAY("Tuesday"), 
     WEDNESDAY("Wednesday"), 
     THURSDAY("Thursday"), 
     FRIDAY("Friday"), 
     SATURDAY("Saturday"), 
     SUNDAY("Sunday"); 
     private final String value; 
     private static Map<String, MyClass.StartDayOfWeek> constants = new HashMap<String, MyClass.StartDayOfWeek>(); 

     static { 
      for (MyClass.StartDayOfWeek c: values()) { 
       constants.put(c.value, c); 
      } 
     } 

     private StartDayOfWeek(String value) { 
      this.value = value; 
     } 

     @JsonValue 
     @Override 
     public String toString() { 
      return this.value; 
     } 

     @JsonCreator 
     public static MyClass.StartDayOfWeek fromValue(String value) { 
      MyClass.StartDayOfWeek constant = constants.get(value); 
      if (constant == null) { 
       throw new IllegalArgumentException(value); 
      } else { 
       return constant; 
      } 
     } 

    } 

} 

ऊपर कोड JSON डेटा कि चारों ओर से पारित कर दिया है करने के लिए "सोमवार", "Tuesday" में संभव स्ट्रिंग मान तक सीमित रखना चाहिए, "बुधवार", आदि

मैं विचाराधीन कोड पर स्कीमा जनरेटर चलाने के लिए, मैं निम्नलिखित स्कीमा की तरह कुछ प्राप्त करने की उम्मीद:

{ 
    "type" : "object", 
    "javaType" : "my.package.MyClass", 
    "properties": { 
    "startDayOfWeek" : { 
     "type" : "string", 
     "enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] 
    } 
    } 
} 

लेकिन इसके बजाय मैं इस हो रही है:

{ 
    "type" : "object", 
    "id" : "urn:jsonschema:my:package:MyClass", 
    "title" : "Lmy/package/MyClass;", 
    "properties" : { 
    "startDayOfWeek" : { 
     "type" : "string" 
    } 
    } 
} 

मैंने जैक्सन स्कीमा मॉड्यूल स्रोत कोड में कुछ खुदाई की है और यह पता लगाया है कि जैक्सन का उपयोग ".toString()" को enum प्रकारों के लिए डिफ़ॉल्ट क्रमिकरण विधि के रूप में कर रहा है, लेकिन इसके बजाय मुझे इसके लिए क्या करना है

"enum" : [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] 

किसी को भी ऐसा करने के लिए कैसे पता है: लाइन है कि इस तरह दिखता है StartDayOfWeek.values() के आधार पर बनाए है?

+0

हो सकता है कि आप के बजाय JJSchema कोशिश करना चाहते हैं। – fge

+0

यह देखते हुए कि मुझे उपयोग के उदाहरण का पालन करते समय एनपीई मिलती है, तथ्य यह है कि परियोजना में 6 महीने में कोई अपडेट नहीं हुआ है और तथ्य यह है कि यह अभी भी बीटा राज्य में स्पष्ट रूप से है, मुझे नहीं लगता कि यह बहुत है अच्छा विकल्प – StormeHawke

+0

क्या आप सप्ताहांत मूल्यों के दिन ठीक से deserialize (यानी enum, स्ट्रिंग के रूप में नहीं) के लिए एक कस्टम deserializer का उपयोग करने के लिए तैयार हैं? – user3159253

उत्तर

2

स्टॉर्म के जवाब का संदर्भ org.codehaus, जैक्सन के एक पुराने संस्करण है जो:

यहाँ भविष्य Googler के लिए कोड है। निम्नलिखित समान है लेकिन fastxml (नया संस्करण) का उपयोग करता है।

पोम:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.7.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.7.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
    <version>2.7.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.module</groupId> 
    <artifactId>jackson-module-jsonSchema</artifactId> 
    <version>2.1.0</version> 
</dependency> 

कोड:

import ...TargetClass; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 
import com.fasterxml.jackson.databind.jsonschema.JsonSchema; 

import java.io.IOException; 

public final class JsonSchemaGenerator { 

    private JsonSchemaGenerator() { }; 

    public static void main(String[] args) throws IOException { 
     System.out.println(JsonSchemaGenerator.getJsonSchema(TargetClass.class)); 
    } 

    public static String getJsonSchema(Class clazz) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); 
     JsonSchema schema = mapper.generateJsonSchema(clazz); 
     return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema); 
    } 

} 
+1

नोट नहीं करते हैं कि दोनों org.codehaus।जैक्सन और com.fasterxml.jackson जेसन स्कीमा के v3 संस्करण उत्पन्न करेगा और v4 नहीं। अधिक जानकारी - https://github.com/FasterXML/jackson-module-jsonSchema/issues/9 –

11

डेटाबेस का उपयोग करके मिले निर्देशों का उपयोग करना संभव नहीं लगता है। हालांकि मुझे एक और जैक्सन मॉड्यूल मिला जो कि अच्छी तरह से चाल चल रहा है। विचित्र रूप से कई वस्तुओं का नाम वही है।

टीएलडीआर: com.fasterxml.jackson.databind पैकेज के बजाय org.codehaus.jackson.map पैकेज से ऑब्जेक्ट का उपयोग करें। यदि आप this पृष्ठ पर निर्देशों का पालन कर रहे हैं तो आप इसे गलत कर रहे हैं। इसके बजाय जैक्सन-मैपर मॉड्यूल का उपयोग करें।

private static String getJsonSchema(Class clazz) throws IOException { 
    org.codehaus.jackson.map.ObjectMapper mapper = new ObjectMapper(); 
    //There are other configuration options you can set. This is the one I needed. 
    mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true); 

    JsonSchema schema = mapper.generateJsonSchema(clazz); 

    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema); 
} 
+1

कोडहॉस जैक्सन के पुराने संस्करण का प्रतिनिधित्व करता है ना? –

+0

मुझे ऐसा लगता है। मुझे पता है कि यह मेरे लिए काम करता है जहां अन्य प्रयास – StormeHawke

संबंधित मुद्दे