2013-04-03 6 views
9

मुझे एक विश्वसनीय JSON स्ट्रिंग सत्यापनकर्ता के साथ आने में कुछ मदद चाहिए - एक विधि जो एक स्ट्रिंग का सेवन करती है और जांचती है कि यह वैध JSON है या नहीं। उदाहरण: यदि मैं {"color":"red"} या {"amount":15} पास करता हूं तो यह गुजर जाएगा लेकिन "My invalid json" जैसे कुछ नहीं होगा। संक्षेप में मुझे ऐसा कुछ चाहिए जो www.jsonlint.com सत्यापनकर्ता के रूप में विश्वसनीय है। बीटीडब्ल्यू - मुझे जावा ऑब्जेक्ट में deserializing में दिलचस्पी नहीं है, क्योंकि यह मेरी आवश्यकता नहीं है। मुझे एक मनमानी स्ट्रिंग मिल सकती है और मुझे बस इतना करना है कि यह वैध JSON प्रारूप है।जावा में विश्वसनीय JSON स्ट्रिंग सत्यापनकर्ता

मैंने पहले से ही इस मंच पर जावा JSON स्ट्रिंग सत्यापन के विषय में कई पोस्टों पर शोध किया है।

मैं अब तक क्या किया: निम्न तरीके से org.json.JSONObject और org.json.JSONArray:

मैं इन कक्षाओं में उपयोग करने की कोशिश

private static boolean isValidJSONStringObject(String requestBody){ 
    try { 
     new JSONObject(requestBody); 
    } catch (JSONException jsonEx) { 
     return false; 
    } 
    return true; 
} 

private static boolean isValidJSONStringArray(String requestBody) { 
    try { 
     new JSONArray(requestBody); 
    } catch (JSONException jsonEx) { 
     return false; 
    } 
    return true; 
} 

हालांकि, निम्नलिखित तार (पूरे लाइनों) अभी भी अपनाते हैं, और वे नहीं करना चाहिए:

{"color":"red"}{"var":"value"} 

[1,2,3][true,false] 
दूसरे शब्दों में

जब मैं वस्तुओं/सरणियों w/बाहर कुछ पैरेंट ऑब्जेक्ट में कोई कैप्सूलीकरण दोहराया है। यदि आप इन पंक्तियों को www.jsonlint.com सत्यापनकर्ता में पेस्ट करते हैं तो वे दोनों विफल हो जाते हैं।

मुझे पता है कि हमेशा एक रेगेक्स विकल्प होता है लेकिन मुझे लगता है कि जेएसओएन की पुनरावर्ती प्रकृति की वजह से 100% की गारंटी नहीं दी जा सकती है और उन रेगेक्स अभिव्यक्तियां जटिल हैं।

किसी भी मदद की सराहना की जाएगी!

+0

क्या आपने अन्य पुस्तकालयों की कोशिश की? मुझे लगता है कि जैक्सन उस उदाहरण की अनुमति नहीं देता है। – yshavit

+1

'" मेरा अमान्य जेसन "' अवैध JSON का एक बुरा उदाहरण है, क्योंकि वास्तव में, यह एक वैध JSON स्ट्रिंग है। – pfyod

उत्तर

6

जीसन इसे संभाल सकता है।

public boolean isValid(String json) { 
    try { 
     new JsonParser().parse(json); 
     return true; 
    } catch (JsonSyntaxException jse) { 
     return false; 
    } 
} 

String json = "{\"color\":\"red\"}{\"var\":\"value\"}"; 
System.out.println(isValid(json)); 

नोट Gson इनपुट JSON में कुछ उदारता है, जो वांछित नहीं किया जा सकता की अनुमति देने वाला: यहाँ एक उदाहरण है। उदाहरण के लिए, अनारक्षित कुंजी स्वचालित रूप से पार्सर द्वारा उद्धृत लोगों में परिवर्तित हो जाती हैं। यह आपके अपेक्षित उपयोग के आधार पर एक सौदा-ब्रेकर हो सकता है या नहीं भी हो सकता है।

+1

जैक्सन लाइब्रेरी इसे तब तक संभालने में प्रतीत नहीं होता जबतक कि आप यह नहीं जानते कि आप किस प्रकार की वस्तु को deserialize करने जा रहे हैं। यह जीसन लाइब्रेरी बेहतर है, लेकिन थोड़ा सा झुकाव लगता है। उदाहरण के लिए, यह त्रुटि को फेंकने के बजाय 'abc'' 'abc' 'में परिवर्तित करता है। लेकिन अगर आप केवल '.isJsonObject() '(' JsonElement' 'की विधि को स्वीकार्य हैं, तो यह अच्छी तरह से काम करता है। – Allan

+1

@ एलन - जैक्सन *** *** एक अंतिम ऑब्जेक्ट प्रकार के बिना जेएसओएन पार्स कर सकते हैं (उदाहरण के लिए 'readTree' विधियों में से एक का उपयोग करके)। लेकिन यह (डिफ़ॉल्ट रूप से) अमान्य JSON के लिए विश्वसनीय रूप से वापस रिपोर्ट नहीं करता है।कुछ सम्मान में जीसन उदारता मोड नरम है, और नवीनतम माना गया बग फिक्स स्पष्ट रूप से नहीं आयोजित किया गया है। प्रतिक्रिया के लिए धन्यवाद, मैंने अपना जवाब अपडेट कर लिया है। – Perception

+0

हां, जीसन पार्सर के "मुलायम उदारता मोड" को देखते हुए हमने अपनी सभी आवश्यकताओं को पूरा करने के लिए जैक्सन पार्सर के साथ पूरक होने के लिए (अभी के लिए) निर्णय लिया। – rich

3

यहां हमारे लिए समाधान है। दो अलग-अलग पुस्तकालयों (जीसन - पहली निजी विधि और जैक्सन - दूसरी निजी विधि) का उपयोग आदर्श नहीं है लेकिन कम से कम हम अपने सभी यूनिट/एकीकरण परीक्षणों को पार कर रहे हैं। मैं शर्त लगाता हूं कि हम सिर्फ जैकसन उपकरणों के साथ ही ऐसा कर सकते हैं।

public static boolean isStringValidJSON(String jsonString) { 
    return (isJSONStringObjectOrArray(jsonString) && isJSONStringParsable(jsonString)); 
} 

private static boolean isJSONStringObjectOrArray(String jsonString) { 
    try { 
     JsonElement element = new JsonParser().parse(jsonString); 

     return (element.isJsonObject() || element.isJsonArray()); 
    } catch (JsonSyntaxException jsonEx) { 
     return false; 
    } 
} 

private static boolean isJSONStringParsable(String jsonString) { 
    try { 
     org.codehaus.jackson.JsonParser parser = 
      new ObjectMapper().getJsonFactory().createJsonParser(jsonString); 
     while(parser.nextToken() != null) { 
     } 
     return true; 
    } catch (JsonParseException e) { 
     return false; 
    } catch (IOException e) { 
     return false; 
    } 
} 
-3

अपनी स्ट्रिंग here पेस्ट करें। आउटपुट देखें।

संपादित करें:

ऊपर दिए लिंक पर अब और काम नहीं करता है, this एक अच्छा विकल्प है।

+2

ओपी इस प्रोग्रामेटिक तरीके से करने की कोशिश कर रहा है। एक उपकरण से नहीं। – SMR

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