2013-08-05 6 views
6

इस प्रकार मेरे नमूना JSON इनपुट है:जब एक JSON वस्तु खोज मामले को अनदेखा कैसे

"JobName":"Test Job 1", 
"events":[ 
    { "features":[], 
     "InputHiveTable":"uilog_uiclientlogdata", 
     "eventColumn":"command", 
     "name":"edu.apollogrp.classroom.discussion.client.events.CreateDiscussionEvent" 
    }, 

क्षेत्र "InputHiveTable" पर विचार करें, यह सभी बड़े INPUTHIVETABLE में हो सकता है, सभी लोअरकेस inputhivetable, या के रूप में दोनों का एक मिश्रण यह अभी है।

वर्तमान में, मैं (जावा में) क्षेत्र के रूप में इस प्रकार है पढ़ रहा हूँ:

JSONObject jsonObject = (JSONObject) obj; 
JSONArray events = (JSONArray) jsonObject.get("events"); 
String InputHiveTable = (String)event.get("InputHiveTable"); 

तो मेरे सवाल का मैं क्षेत्र "InputHiveTable" के लिए खोज कैसे मामले को अनदेखा करते हुए है। मैं JSON सरल पुस्तकालयों का उपयोग कर रहा हूं।

उत्तर

14

आप इस केस-संवेदी देखने कई बार प्रदर्शन करने के लिए है, तो मैं सिर्फ एक विधि लिखते हैं कि देखने करने के लिए:

  • यह नए कंटेनर MyContainerFactory साथ चलाने के लिए

    public Object getIgnoreCase(JSONObject jobj, String key) { 
    
        Iterator<String> iter = jobj.keySet().iterator(); 
        while (iter.hasNext()) { 
         String key1 = iter.next(); 
         if (key1.equalsIgnoreCase(key)) { 
          return jobj.get(key1); 
         } 
        } 
    
        return null; 
    
    } 
    
  • 1

    एक JSONObject एक hashmap

    public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{ 
    

    जैसे के रूप में कार्यान्वित किया जाता है, वहाँ जब इसकी मैप किया गया मान प्राप्त करने की कोशिश कर स्ट्रिंग कुंजी के मामले की अनदेखी करने का कोई तरीका नहीं है। उस जेएसओएन को उत्पन्न करने के लिए आपको कुछ नियमों के साथ आना होगा।

    0

    आप जावा स्ट्रिंग में JSONObject पढ़ सकते हैं, और उस पर String.toLowerCase को कॉल कर सकते हैं और इसे वापस JSONObject में संग्रहीत कर सकते हैं। यह स्ट्रिंग के पूरे मामले को कम मामले में बदल देगा, इसलिए आपको अपने तर्क में कहीं और इसके लिए खाते रखना होगा। उसके बाद, आपको बस "अप्रभावी" पर कॉल प्राप्त करना होगा।

    किसी भी तरह से यह एक सुंदर समाधान नहीं है, लेकिन यह आपके लिए एक संभावित काम है यदि आपके JSON इनपुट के रूप में आप जो भी लौट रहे हैं उसे संभालने के लिए बिल्कुल कोई अन्य तरीका नहीं है।

    +2

    इससे मूल्यों के साथ-साथ चाबियों को कम करने का अलग नुकसान होगा। अकेले चाबियों पर केस-असंवेदनशील मैच करने का कोई आसान तरीका नहीं होगा, बिना चाबियाँ प्राप्त करने या पार्सर बदलने जैसे अधिक फैंसी प्राप्त किए बिना। – BobDoolittle

    +0

    क्या वह कार्य करता है जब मानों का स्वरूपण महत्वपूर्ण नहीं होता है। मेरे मामले में, मेरे सभी मूल्य संख्याएं हैं। –

    1

    को देखते हुए यह मामला-असंवेदनशीलता (String.CASE_INSENSITIVE_ORDER तुलनित्र के माध्यम से यानी) ट्री-मैप के साथ प्राप्त किया जा सकता, तो आप शायद निम्न कर सकते हैं:

    1. लागू अपनी खुद की MyJSONObjectTreeMap विस्तार जहां इसकी तरीकों सिर्फ स्थिर तरीकों कॉल करेंगे JSONObject के समान हस्ताक्षर और सभी आवश्यक इंटरफेस के साथ JSONObject में। डिफ़ॉल्ट निर्माता में लिखने super(String.CASE_INSENSITIVE_ORDER)

    2. ContainerFactory इंटरफ़ेस को लागू जहां createObjectContainerMyJSONObject का नया उदाहरण वापस आ जाएगी (और createArrayContainer सिर्फ नई JSONArray वापस आ जाएगी)।

      StringReader in = new StringReader(yourJSONString);      
      JSONParser parser = new JSONParser();  
      parser.parse(in, yourContainerFactory) 
      
    संबंधित मुद्दे