2016-08-09 6 views
6

अब मैं एक कुंजी से JSONObject डेटा प्राप्त करने का एक आम तरीका लिखता हूं। इसे सामान्य विधि में कैसे बदला जाए? अब जब मैं विधि को कॉल करता हूं तो मुझे हर बार प्रकार बदलना होगा।मेरी विधि को सामान्य विधि में कैसे बदलें?

String a= (String) ObdDeviceTool.getResultData(result, "a", String.class); 
Double b= (Double) ObdDeviceTool.getResultData(result, "b", Double.class); 
public static Object getJSONObjectData(JSONObject result,String key,Object type){ 
    if (result.containsKey(key)) { 
     if(type.equals(String.class)) 
      return result.getString(key); 
     if(type.equals(Double.class)) 
      return result.getDouble(key); 
     if(type.equals(Long.class)) 
      return result.getLong(key); 
     if(type.equals(Integer.class)) 
      return result.getInt(key); 
    } 
    return null; 
} 
+0

@ JonnyHenly, मैं कोशिश की है, लेकिन लगता है यह स्थिर टी getJSONObjectData (JSONObject परिणाम, स्ट्रिंग कुंजी, टी प्रकार) – flower

उत्तर

3
private static <T> T getJSONObjectData(JSONObject result, String key, Class<T> type) 
{ 
    Object value = result.get(key); 
    return type.cast(value); 
} 

क्या आप के बारे में पता होना चाहिए:

  • अप करता है, तो key एक JSONException इच्छा बुलबुला result
  • ऊपर एक ClassCastException इच्छा बुलबुला में मौजूद नहीं है, तो type असली प्रकार से मेल नहीं खाता value

ऊपर दिए गए एक स्तर को संभालने के लिए स्वतंत्र महसूस करें यदि आवश्यक हो तो

+0

यह है एक बग, अगर कुंजी मान IS0, result.getDouble (key) change.public नहीं कर सकते ठीक है। लेकिन Double.cast (0) गलत है। – flower

+0

@flower हम आप सही हैं। हालांकि मुझे यकीन नहीं है कि इसे हल करने का सबसे अच्छा तरीका क्या होगा। क्या आपके लिए मूल्य 'संख्या' के रूप में पुनर्प्राप्त करना स्वीकार्य है? अन्यथा इस समाधान के साथ आपको '0.0' डालने पर ध्यान देना होगा जब आप जानते हैं कि आप इस मान को डबल के रूप में पुनर्प्राप्त करेंगे। – Spotted

+0

हां, अगर यह 0 लौटाता है लेकिन कभी-कभी डबल मान देता है, तो मैं आपके रास्ते का उपयोग नहीं कर सकता। इसलिए मैं प्रश्न डेमो में अपने पुराने तरीके का उपयोग करता हूं। – flower

1

JSONObject में एक ऐसी विधि है जो किसी ऑब्जेक्ट को लौटाती है।

Integer i = (Integer) result.get("integerKey"); 
String s = (String) result.get("stringKey"); 
Double d = (Double) result.get("doubleKey"); 

result आपकी JSONObject ऑब्जेक्ट है।

2

थोड़ा आगे @Spotted द्वारा जवाब ले रहा है, मैं रणनीति पैटर्न का उपयोग करें और इस तरह कुछ करना चाहते हैं:

private static final Map<Class<?>, BiFunction<JSONObject, String, Object>> converterMap = 
    initializeMap(); 

private static Map<Class<?>, BiFunction<JSONObject, String, Object>> initializeMap() { 
    Map<Class<?>, BiFunction<JSONObject,String, Object>> map = new HashMap<>(); 
    map.put(String.class, (jsonObject, key) -> jsonObject.getString(key)); 
    map.put(Integer.class, (jsonObject, key) -> jsonObject.getInt(key)); 
    // etc. 
    return Collections.unmodifiableMap(map); 
} 

private static <T> Optional<T> getJSONObjectData(JSONObject json, String key, Class<T> type) { 

    return 
    Optional.ofNullable(converterMap.get(key)) 
    .map(bifi -> bifi.apply(json, key)) 
    .map(type::cast); 
} 

अब आप कन्वर्टर्स का एक नक्शा है, जहां मुख्य लक्ष्य प्रकार है। यदि आपके प्रकार के लिए कनवर्टर मौजूद है, तो इसका उपयोग किया जाता है, और आपकी ऑब्जेक्ट सही प्रकार में लौटा दी जाती है। अन्यथा, वैकल्पिक .empty() वापस आ गया है।
Consider typesafe heterogeneous containers:

यह की
Effective Java (2nd Edition) मद 29 एक आवेदन है।

+0

मुझे सुरक्षित कास्टिंग के लिए यह जवाब पसंद है लेकिन यह संकलित नहीं करता है। आपको 'मानचित्र <..., फंक्शन <...>> '' मानचित्र <<, BCFunction <...>> 'और' कनवर्टरमैप.get (कुंजी) '' कनवर्टर मैप.जेट (प्रकार)' के साथ बदलना चाहिए। – Spotted

+0

@ स्पॉट एह हां, पहले के संस्करण से दोबारा प्रतिक्रिया दी गई और एक जगह चूक गई। धन्यवाद –

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