2013-01-24 8 views
16

के खिलाफ स्ट्रिंग JSON मान्य करें मुझे किसी दिए गए JSON-schema स्ट्रिंग के विरुद्ध JSON स्ट्रिंग को सत्यापित करने का सबसे आसान तरीका खोजने में समस्या हो रही है (संदर्भ के लिए, यह जावा में है, एंड्रॉइड ऐप में चल रहा है)।जावा/एंड्रॉइड - स्ट्रिंग स्कीमा

आदर्श रूप में, मैं बस एक JSON स्ट्रिंग और JSON-schema स्ट्रिंग में पास करना चाहता हूं, और यह एक बूलियन देता है कि यह सत्यापन को पास करता है या नहीं। खोज के माध्यम से, मैं इस पूरा करने के लिए निम्नलिखित 2 होनहार पुस्तकालयों पाया है:

http://jsontools.berlios.de/

https://github.com/fge/json-schema-validator

हालांकि, पहले एक काफी गरीब समर्थन के साथ पुराना लगता है। मैंने पुस्तकालय को अपनी परियोजना में कार्यान्वित किया, और यहां तक ​​कि उनके जावाडॉक्स के साथ, मैं यह बताने में असमर्थ था कि सत्यापन के लिए "सत्यापनकर्ता" ऑब्जेक्ट को सही तरीके से कैसे बनाया जाए।

दूसरे के साथ समान कहानी, जो कि अच्छे परीक्षण कोड के साथ अद्यतित है। हालांकि, मैं जो करना चाहता हूं, वह बहुत आसान है, यह थोड़ा मुश्किल और भ्रमित प्रतीत होता है कि मैं जो चाहता हूं उसे विशेष रूप से पूरा करने के लिए (ValidateServlet.java फ़ाइल को देखने के बाद भी)।

उत्सुक अगर किसी को यह पूरा करने के लिए एक अच्छा तरीका है (इसे क्या लगता है), सरल कार्य की आवश्यकता है, या यदि मुझे शायद ऊपर से दूसरे विकल्प के साथ चिपकने की आवश्यकता है? अग्रिम में धन्यवाद!

+2

लेखक ... तुम नहीं किया रीडमे में देखें कि कोड नमूने के लिए एक लिंक था? ;) – fge

+0

हाय वहाँ, और आपकी महान पुस्तकालय के लिए धन्यवाद! हां वास्तव में, मैंने कोड के नमूनों को देखा और वास्तव में एक एम्बेडेड लिंक (ValidateServlet.java फ़ाइल) के साथ मेरी पोस्ट में इसका उल्लेख किया। इस पुस्तकालय के लिए फिर से धन्यवाद! महान सामान :) – svguerin3

+0

मैं इस नमूने के बारे में बात नहीं कर रहा था: मैं javadoc में 'com.github.fge.jsonschema.examples' के बारे में बात कर रहा था;) बीटीडब्ल्यू, 1.6.0 बाहर है। – fge

उत्तर

10

यह अनिवार्य रूप से आपके द्वारा लिंक किया गया सर्वलेट है, इसलिए यह एक लाइनर नहीं हो सकता है लेकिन यह अभी भी अभिव्यक्तिपूर्ण है।

useV4 और useId सर्वलेट पर निर्दिष्ट अनुसार, Default to draft v4 और Use id for addressing के लिए सत्यापन विकल्प निर्दिष्ट करने के लिए हैं।

आप इसे ऑनलाइन देख सकते हैं: जावा आधारित json स्कीमा प्रोसेसर लिखने के लिए http://json-schema-validator.herokuapp.com/

public boolean validate(String jsonData, String jsonSchema, boolean useV4, boolean useId) throws Exception { 
    // create the Json nodes for schema and data 
    JsonNode schemaNode = JsonLoader.fromString(jsonSchema); // throws JsonProcessingException if error 
    JsonNode data = JsonLoader.fromString(jsonData);   // same here 

    JsonSchemaFactory factory = JsonSchemaFactories.withOptions(useV4, useId); 
    // load the schema and validate 
    JsonSchema schema = factory.fromSchema(schemaNode); 
    ValidationReport report = schema.validate(data); 

    return report.isSuccess(); 
} 
+0

शानदार, धन्यवाद! मुझे लगता है कि मुझे शायद इस पुस्तकालय का उपयोग करने के उचित तरीके से सही दिशा में एक झुकाव की जरूरत है। मैं इसकी प्रशंसा करता हूँ! – svguerin3

+1

ध्यान दें कि कार्यान्वयन '$ स्कीमा 'और ड्राफ्ट v3 के लिए डिफ़ॉल्ट का पता लगाता है। ज्यादातर मामलों में, आप बस 'JsonSchemaFactory.defaultFactory() 'का उपयोग करते हैं। – fge

13

एक आभारी डगलस Crockford और फ्रांसिस Galiegue लिए धन्यवाद! और http://json-schema-validator.herokuapp.com/index.jsp पर ऑनलाइन परीक्षक भयानक है! मुझे वास्तव में सहायक त्रुटि संदेशों को पसंद है (मुझे केवल एक उदाहरण मिला जिसमें वे असफल रहे), हालांकि रेखा और कॉलम और/या संदर्भ बेहतर होगा (अभी, आपको केवल JSON प्रारूप त्रुटियों के दौरान लाइन और कॉलम जानकारी मिलती है (जैक्सन की सौजन्य) अंत में, मैं अपने महान ट्यूटोरियल के लिए माइकल डेटेटबूम का शुक्रिया अदा करना चाहता हूं (भले ही वह केवल पाइथन, रूबी और सी को कवर करता है, जबकि सभी की सर्वोत्तम भाषा को स्पष्ट रूप से अनदेखा कर रहा है :-))।

उन लोगों के लिए जिन्होंने इसे याद किया (जैसे मैंने पहले किया था), उदाहरण हैं github.com/fge/json-chechema-processor-examples पर उदाहरण हैं। हालांकि ये उदाहरण बहुत प्रभावशाली हैं, लेकिन वे साधारण जेसन सत्यापन उदाहरण नहीं हैं जिन्हें मूल रूप से अनुरोध किया गया था (और मैं भी ढूंढ रहा था)। सरल उदाहरण github.com/fge/json-schema-validator/blob/master/src/main/java/com/github/fge/jsonschema/examples/Example1.java

उपरोक्त एलेक्स का कोड काम नहीं करता है मेरे लिए, लेकिन बहुत मददगार था; मेरा पोम नवीनतम मैवेन पोम में डाली गई निम्नलिखित निर्भरता के साथ नवीनतम स्थिर रिलीज, संस्करण 2.0.1 खींच रहा है।xml फ़ाइल:

<dependency> 
    <groupId>com.github.fge</groupId> 
    <artifactId>json-schema-validator</artifactId> 
    <version>2.0.1</version> 
</dependency> 

तो निम्नलिखित जावा कोड मेरे लिए ठीक काम करता है:

import java.io.IOException; 
import java.util.Iterator; 
import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.databind.JsonNode; 
import com.github.fge.jsonschema.exceptions.ProcessingException; 
import com.github.fge.jsonschema.main.JsonSchema; 
import com.github.fge.jsonschema.main.JsonSchemaFactory; 
import com.github.fge.jsonschema.report.ProcessingMessage; 
import com.github.fge.jsonschema.report.ProcessingReport; 
import com.github.fge.jsonschema.util.JsonLoader; 


public class JsonValidationExample 
{ 

public boolean validate(String jsonData, String jsonSchema) { 
    ProcessingReport report = null; 
    boolean result = false; 
    try { 
     System.out.println("Applying schema: @<@<"+jsonSchema+">@>@ to data: #<#<"+jsonData+">#>#"); 
     JsonNode schemaNode = JsonLoader.fromString(jsonSchema); 
     JsonNode data = JsonLoader.fromString(jsonData);   
     JsonSchemaFactory factory = JsonSchemaFactory.byDefault(); 
     JsonSchema schema = factory.getJsonSchema(schemaNode); 
     report = schema.validate(data); 
    } catch (JsonParseException jpex) { 
     System.out.println("Error. Something went wrong trying to parse json data: #<#<"+jsonData+ 
       ">#># or json schema: @<@<"+jsonSchema+">@>@. Are the double quotes included? "+jpex.getMessage()); 
     //jpex.printStackTrace(); 
    } catch (ProcessingException pex) { 
     System.out.println("Error. Something went wrong trying to process json data: #<#<"+jsonData+ 
       ">#># with json schema: @<@<"+jsonSchema+">@>@ "+pex.getMessage()); 
     //pex.printStackTrace(); 
    } catch (IOException e) { 
     System.out.println("Error. Something went wrong trying to read json data: #<#<"+jsonData+ 
       ">#># or json schema: @<@<"+jsonSchema+">@>@"); 
     //e.printStackTrace(); 
    } 
    if (report != null) { 
     Iterator<ProcessingMessage> iter = report.iterator(); 
     while (iter.hasNext()) { 
      ProcessingMessage pm = iter.next(); 
      System.out.println("Processing Message: "+pm.getMessage()); 
     } 
     result = report.isSuccess(); 
    } 
    System.out.println(" Result=" +result); 
    return result; 
} 

public static void main(String[] args) 
{ 
    System.out.println("Starting Json Validation."); 
    JsonValidationExample app = new JsonValidationExample(); 
    String jsonData = "\"Redemption\""; 
    String jsonSchema = "{ \"type\": \"string\", \"minLength\": 2, \"maxLength\": 11}"; 
    app.validate(jsonData, jsonSchema); 
    jsonData = "Agony"; // Quotes not included 
    app.validate(jsonData, jsonSchema); 
    jsonData = "42"; 
    app.validate(jsonData, jsonSchema); 
    jsonData = "\"A\""; 
    app.validate(jsonData, jsonSchema); 
    jsonData = "\"The pity of Bilbo may rule the fate of many.\""; 
    app.validate(jsonData, jsonSchema); 
} 

} 

ऊपर कोड से मेरे परिणाम है:

Starting Json Validation. 
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"Redemption">#># 
Result=true 
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<Agony>#># 
Error. Something went wrong trying to parse json data: #<#<Agony>#># or json schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@. Are the double quotes included? 
Result=false 
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<42>#># 
Processing Message: instance type does not match any allowed primitive type 
Result=false 
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"A">#># 
Processing Message: string is too short 
Result=false 
Applying schema: @<@<{ "type": "string", "minLength": 2, "maxLength": 11}>@>@ to data: #<#<"The pity of Bilbo may rule the fate of many.">#># 
Processing Message: string is too long 
Result=false 

का आनंद लें!

+1

अच्छा उदाहरण धन्यवाद! – vatsa

+0

बढ़िया! धन्यवाद – neverwinter

2

@ एलेक्स के जवाब Android पर मेरे लिए काम किया लेकिन मल्टी डेक्स करने के लिए मुझे जरूरत थी और जोड़ें:

packagingOptions { 
     pickFirst 'META-INF/ASL-2.0.txt' 
     pickFirst 'draftv4/schema' 
     pickFirst 'draftv3/schema' 
     pickFirst 'META-INF/LICENSE' 
     pickFirst 'META-INF/LGPL-3.0.txt' 
    } 

को json-स्कीमा-सत्यापनकर्ता यहाँ की मेरी build.gradle