Ich versuche, einen benutzerdefinierten Gson Serializer/Deserialiser für eine Liste von BasicNameValuePair-Objekten zu implementieren.Benutzerdefinierter Serializer - Deserializer mit GSON für eine Liste von BasicNameValuePairs
sah ich die Teillösung Code (für die Serialisierung) hier: How do I get Gson to serialize a list of basic name value pairs?
jedoch auch Deserialisierung implementieren ich wollte, und ich versuchte, meine Chancen und der Code ist hier:
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;
}
}
-Code initialisieren und füllen Sie die Liste
ArrayList<BasicNameValuePair> postParameters=new ArrayList<BasicNameValuePair>();
postParameters.add(new BasicNameValuePair("some_key","some_value"));
Und hier ist der Code die neue KeyValuePairSerializer Klasse zu verwenden:
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);
Das Problem ist, dass es eine Ausnahme am Ende wirft und ich weiß nicht, wo genau das Problem ist, und immer noch nicht sicher, wie die letzte Zeile zu schreiben, zu erhalten das Ergebnis zurück in der neuen postParameters2 ArrayList.
Doing so etwas wird meine neue definierte Klasse KeyValuePairSerializer ignorieren und nicht die überschriebene Methode aufrufen: lesen. – Arise
Eigentlich ignoriert es es nicht, wenn Sie 'registerTypeAdapter()' aufrufen, wie Sie in der Frage getan haben. – Nachi
Es scheint nicht der Fall zu sein. RegisterTypeAdapter scheint nur für den Serializer nicht für Deserializer zu funktionieren. – Arise