2014-06-09 6 views
7

पाने के लिए जब हम JsonObject सामग्रीGson कैसे धारावाहिक नाम

{ 
    "name" : "string", 
    "category" : "string", 
} 

के लिए प्रारूप

public class Field { 
    @SerializedName("name") 
    public String name; 
    @SerializedName("category") 
    public String category; 

} 

निम्नलिखित और सामग्री

Field field = new GsonBuilder().create().fromJson(
       content, Field.class); 

तो पार्स करने के लिए Gson का उपयोग कर के साथ एक वर्ग को परिभाषित , मेरा प्रश्न है कि हमप्राप्त करने के लिए Gson का उपयोग कर सकते हैंनाम। इस उदाहरण में मैं जानना चाहता हूं कि @Serialized नाम field.name के लिए उपयोग किया जाता है, जो name है और field.category है जो category है।

अनुसार @Sotirios Delimanolis ने सुझाव दिया, Reflection का उपयोग कर हम Field वस्तु आप चाहते हैं पुनः प्राप्त करने के Serialized नाम

java.lang.reflect.Field fields = Field.class.getDeclaredField("name");    
SerializedName sName =fields.getAnnotation(SerializedName.class);    
System.out.println(sName.value()); 
+1

यदि हमारे पास "नाम" है तो प्रतिबिंब का उपयोग करने और मूल्य प्राप्त करने की कोई आवश्यकता नहीं है। क्या वास्तव में स्ट्रिंग "नाम" –

उत्तर

9

उपयोग प्रतिबिंब प्राप्त कर सकते हैं। SerializedName उदाहरण प्राप्त करने के लिए आप Field#getAnnotation(Class) का उपयोग कर सकते हैं जिस पर आप नाम प्राप्त करने के लिए value() पर कॉल कर सकते हैं।

+0

का उपयोग किए बिना चर 'नाम' का उपयोग करने जैसे फ़ील्ड से प्राप्त करने का कोई तरीका है, मैं इस 'फ़ील्ड' की तरह उपयोग कर रहा हूं, कक्षा 'फ़ील्ड' का मेरा 'ऑब्जेक्ट' है। और मैं 'field.name.getClass() प्राप्त कर रहा हूं। Getnnotation (SerializedName.class) .value()'। लेकिन यह मुझे 'NullPointer अपवाद' देता है। – laaptu

+1

@laaptu इससे आपकी सहायता नहीं होती है कि आपकी कक्षा को 'फ़ील्ड' नाम दिया गया है। मेरा मतलब था 'java.lang.reflect.Field'। अपने ** 'फ़ील्ड 'वर्ग की' कक्षा 'ऑब्जेक्ट प्राप्त करें और अपने' name' फ़ील्ड के लिए' फ़ील्ड 'ऑब्जेक्ट प्राप्त करने के लिए 'getDeclaredField()' का उपयोग करें। –

+2

'java.lang.reflect.Field फ़ील्ड = Field.class.getDeclaredField (" name "); \t \t \t SerializedName sName = fields.getAnotation (SerializedName.class); \t \t \t System.out.println (sName.value()); 'इसके लिए धन्यवाद। लेकिन क्या कोई अन्य तरीका नहीं है जिसे मैं 'प्रतिबिंब' के बिना कार्यान्वित कर सकता हूं क्योंकि मैंने सुना है कि 'प्रतिबिंब' सीपीयू गहन है। और मैं इसे 'एंड्रॉइड' – laaptu