2013-03-20 11 views
7

की सूची के लिए जीएसओएन का उपयोग करके deserializer मैं BasicNameValuePair ऑब्जेक्ट्स की कुछ सूची के लिए कस्टम जीसन सीरियलाइज़र/deserialiser को लागू करने की कोशिश कर रहा हूं।कस्टम सीरिएलाइज़र - बेसिकनाम वैल्यूपेयर

मैं (क्रमबद्धता के लिए) आंशिक समाधान कोड देखा यहाँ: How do I get Gson to serialize a list of basic name value pairs?

हालांकि मैं भी लागू करने के लिए अक्रमांकन चाहता था और मैं अपने संभावना की कोशिश की और कोड यहाँ है:

package dto; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.message.BasicNameValuePair; 


import com.google.gson.TypeAdapter; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonWriter; 


    public class KeyValuePairSerializer extends TypeAdapter<List<BasicNameValuePair>> { 
     @Override 
     public void write(JsonWriter out, List<BasicNameValuePair> data) throws IOException { 
      out.beginObject(); 
      for(int i=0; i<data.size();i++){ 
       out.name(data.get(i).getName()); 
       out.value(data.get(i).getValue()); 
      } 
      out.endObject(); 
     } 

     @Override 
     public List<BasicNameValuePair> read(JsonReader in) throws IOException { 
      ArrayList<BasicNameValuePair> list=new ArrayList<BasicNameValuePair>(); 
      in.beginObject(); 
      while (in.hasNext()) { 
       String key = in.nextName(); 
       String value = in.nextString(); 
       list.add(new BasicNameValuePair(key,value)); 
      } 
      in.endObject(); 
      return list; 
     } 

} 

कोड सूची को शुरू करने और भरने के लिए

ArrayList<BasicNameValuePair> postParameters=new ArrayList<BasicNameValuePair>(); 
postParameters.add(new BasicNameValuePair("some_key","some_value")); 

और यहां है कोड नए KeyValuePairSerializer वर्ग का उपयोग करें:

 GsonBuilder gsonBuilder= new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(KeyValuePairSerializer.class, new KeyValuePairSerializer()); 
     Gson gson1=gsonBuilder.create(); 

     //serialization works just fine in the next line 
     String jsonUpdate=gson1.toJson(postParameters, KeyValuePairSerializer.class); 


     ArrayList<BasicNameValuePair> postParameters2 = new ArrayList<BasicNameValuePair>(); 
     //postParameters2 = gson1.fromJson(jsonUpdate, KeyValuePairSerializer.class); //? how to cast properly 
     //deserialization throws an error, it can't cast from ArrayList<BasicNameValuePair> to KeyValuePairSerializer 
     gson1.fromJson(jsonUpdate, KeyValuePairSerializer.class); 

समस्या यह है कि अंत में एक अपवाद फेंकता है और मैं नहीं जानता कि जहां वास्तव में समस्या यकीन है कि कैसे प्राप्त करने के लिए अंतिम पंक्ति लिखने के लिए नहीं है और अभी भी है परिणाम नए पोस्ट पैरामीटर 2 ArrayList में वापस।

उत्तर

8

GSON Collections Examples से अनुकूलित:

GsonBuilder gsonBuilder= new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(KeyValuePairSerializer.class, new KeyValuePairSerializer()); 
Gson gson1=gsonBuilder.create(); 

Type collectionType = new TypeToken<ArrayList<BasicNameValuePair>>(){}.getType(); 
ArrayList<BasicNameValuePair> postParameters2 = gson1.fromJson(jsonUpdate, collectionType); 
+0

ऐसी चीज करने से मेरी नई परिभाषित कक्षा KeyValuePairSerializer को अनदेखा कर दिया जाएगा और ओवरडिन विधि को कॉल नहीं किया जाएगा: पढ़ें। – Arise

+0

दरअसल, यदि आप 'रजिस्टर टाइप टाइप एडाप्टर()' को कॉल करते हैं तो आप इसे अनदेखा नहीं करेंगे। – Nachi

+0

ऐसा लगता है कि यह मामला नहीं है। रजिस्टर टाइप टाइप एडाप्टर केवल सीरिएलाइज़र के लिए काम करता है जो deserializer के लिए नहीं है। – Arise

1

registerTypeAdapter serializer के लिए deserializer के लिए न केवल काम करने के लिए लगता है। एक चर में परिणाम मूल्य बिना सहेजे gson1.fromJson(jsonUpdate, KeyValuePairSerializer.class);:

अधिरोहित पढ़ KeyValuePairSerializer की समारोह कॉल करने के लिए एक ही रास्ता कॉल करने के लिए है। हालांकि यह फ़ंक्शन को ठीक से संसाधित करेगा, यह जीएसन कक्षा के अंदर एक त्रुटि फेंक देगा क्योंकि यह ArrayList से KeyValuePairSerializer तक नहीं डालेगा। और मैं थोड़ी समझता हूं कि क्यों (मुझे लगता है कि मिटा), बस यह नहीं पता कि इसे ठीक से कैसे किया जाए।

वैसे भी मुझे इस मुद्दे को हल करने के लिए एक समाधान मिला। ऐसा लगता है कि बजाय gson वस्तु दर्ज की और registerTypeAdapter बुला और फिर gson1.toJson(Object src, Type typeOfSrc) और gson1.fromJson(String json,Class <T> classOfT) का उपयोग कर के मैं अक्रमांकन के लिए दूर सरल कुछ के साथ प्राप्त कर सकते हैं की तरह:

KeyValuePairSerializer k= new KeyValuePairSerializer(); 
parametersList = (ArrayList<BasicNameValuePair>)k.fromJson(jsonUpdate); 
-1

मैं GSON Collection Examples के लिए इस ब्लॉग का पालन किया। लिंक समझने और लागू करने के लिए सरल है।

public class TimeSerializer implements JsonSerializer<time> { 

    /** 
    * Implementing the interface JsonSerializer. 
    * Notice that the the interface has a generic 
    * type associated with it. 
    * Because of this we do not have ugly casts in our code. 
    * {@inheritDoc} 
    */ 
    public JsonElement serialize(
        final Time time, 
        final Type type, 
        final JsonSerializationContext jsonSerializationContext) { 

     /** 
     * Returning the reference of JsonPremitive 
     * which is nothing but a JSONString. 
     * with value in the format "HH:MM" 
     */ 
     return new JsonPrimitive(String.format("%1$02d:%2$02d", 
           time.getHour(), time.getMinute())); 
    } 
0

दोनों JSONObject की और शब्दकोशों के लिए एक समान तरीके से NameValuePair के व्यवहार, मैं तुम्हें दूसरे में एक कन्वर्ट करने के लिए करता है, तो उपयोग के मामले के समान है की जरूरत नहीं लगता। इसके अतिरिक्त जेसनऑब्जेक्ट आपको अपने मूल्यों का इलाज करने की इजाजत देता है (मूल्य जोड़ों की सरणी के माध्यम से लूप करने के बजाय आपको जिस चीज की आवश्यकता होती है उसे ढूंढने के लिए, जेसनऑब्जेक्ट एक मानचित्र के समान व्यवहार करता है जिस तरह से आप सीधे कुंजी का नाम कॉल कर सकते हैं जैसा कि ऊपर दिखाया अपने मामले मैं अपने स्ट्रिंग, प्रतिक्रिया या स्ट्रीम से एक JSONObject बनाने और उसके बाद एक नक्शे के रूप में इसे का उपयोग करता हूँ के लिए

jsonObject.get("your key").getAsString(); (getAsBoolean(), getAsInt(), etc). 

(): और यह वांछित संपत्ति लौट जाएँगे)

JsonParser parser = new JsonParser(); 
JsonObject o = (JsonObject)parser.parse("your json string"); 
संबंधित मुद्दे