2013-05-16 6 views
12

का उपयोग कर मुझे एक JSON प्रतिक्रिया का विश्लेषण करने में समस्या है।कस्टम JSON deserializer Gson

JSON स्ट्रिंग:

response: [ 
    2, { 
    owner_id: 23972237, 
    album_id: 25487692, 
    title: 'album not new' 
    }, { 
    owner_id: 23972237, 
    album_id: 25486631, 
    title: 'фыв' 
    } 
] 

मैं इन 2 श्रेणियां होती हैं:

public class VkAudioAlbumsResponse { 
    public ArrayList<VkAudioAlbum> response; 
    public VkError error; 
} 

public class VkAudioAlbum { 
    public int owner_id; 
    public int album_id; 
    public String title; 
} 

लेकिन मैं एक अपवाद जब इस Gson का उपयोग कर पार्स है। मुझे पता है कि ऐसा इसलिए है क्योंकि प्रतिक्रिया सरणी पहला तत्व एक वस्तु नहीं है, लेकिन पूर्णांक है।

तो सवाल यह है कि, क्या मैं इसे किसी भी तरह हल कर सकता हूं?

उत्तर

30

आपको custom deserializer लिखना होगा। मैं इस तरह कुछ करना चाहते हैं:

public class Response { 
    public VkAudioAlbumsResponse response; 
} 

और फिर आप एक कस्टम deserializer, कुछ इसी तरह यह करने की जरूरत है:

सबसे पहले आप, आगे से कम 2 आपके पास पहले से एक नया वर्ग में शामिल करने की जरूरत है इस appr के साथ

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(VkAudioAlbumsResponse.class, new VkAudioAlbumsResponseDeserializer()); 
Gson gson = gsonBuilder.create(); 
Response response = gson.fromJson(jsonString, Response.class); 

:

private class VkAudioAlbumsResponseDeserializer 
    implements JsonDeserializer<VkAudioAlbumsResponse> { 

    @Override 
    public VkAudioAlbumsResponse deserialize(JsonElement json, Type type, 
     JsonDeserializationContext context) throws JsonParseException { 

    JsonArray jArray = (JsonArray) json; 

    int firstInteger = jArray.get(0); //ignore the 1st int 

    VkAudioAlbumsResponse vkAudioAlbumsResponse = new VkAudioAlbumsResponse(); 

    for (int i=1; i<jArray.size(); i++) { 
     JsonObject jObject = (JsonObject) jArray.get(i); 
     //assuming you have the suitable constructor... 
     VkAudioAlbum album = new VkAudioAlbum(jObject.get("owner_id").getAsInt(), 
              jObject.get("album_id").getAsInt(), 
              jObject.get("title").getAsString()); 
     vkAudioAlbumsResponse.getResponse().add(album); 
    } 

    return vkAudioAlbumsResponse; 
    } 
} 

तो फिर तुम जैसे आपके JSON deserialize करने के लिए है ओच, जब जीसन JSON को Response कक्षा में deserialize करने की कोशिश करता है, तो यह पता चलता है कि उस वर्ग में response विशेषता है जो JSON प्रतिक्रिया में नाम से मेल खाता है, इसलिए यह पार्सिंग जारी है।

तो यह पता चलता है कि इस विशेषता प्रकार VkAudioAlbumsResponse की है, इसलिए यह यह पार्स करने के लिए है, जो JSON उत्तर के शेष भाग की प्रक्रिया कस्टम deserializer आपने बनाया है का उपयोग करता है और VkAudioAlbumsResponse की एक वस्तु देता है।

नोट: deserializer में कोड काफी सरल है, तो मैं Gson API Javadoc

+0

ग्रेट उत्तर देखें, मैं एक बनाने के लिए पसंद करते हैं, भले ही लगता है कि आप इसे समझने की कोई समस्या नहीं होगा ... अधिक जानकारी के लिए एक नई कक्षा बनाने के बजाय निजी विधि;) –

+1

@ मैटियाआरगुएरियो मैं उस विशिष्ट जिम्मेदारी के साथ एक अलग वर्ग पसंद करता हूं - बहुत से छोटे वर्ग हमेशा अच्छे आईएमओ होते हैं, जब तक आप उन्हें स्पष्ट रूप से व्यवस्थित करते हैं ... – MikO

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