android - 自定义序列化程序 - 使用 GSON 反序列化 BasicNameValuePair 列表

标签 android json serialization gson key-value

我正在尝试为一些 BasicNameValuePair 对象列表实现自定义 gson 序列化器/反序列化器。

我在这里看到了部分解决方案代码(用于序列化): 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);

问题是它在最后抛出异常,我不知道问题到底出在哪里,仍然不确定如何编写最后一行以将结果返回到新的 postParameters2 ArrayList 中。

最佳答案

改编自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);

关于android - 自定义序列化程序 - 使用 GSON 反序列化 BasicNameValuePair 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15522803/

相关文章:

rest - Symfony序列化器-设置循环引用全局

java - 调用异步任务类不起作用

android - org.apache.http.NoHttpResponseException : The target server failed to respond

javascript - 从下拉列表中选择数据时从 MYSQL 数据库设置输入字段值属性

iPhone + Drupal + JSON RPC 服务器问题

json - Gradle : How to use task's output file data in another task?

Java .dat 文件到 Python pickle

android - 使用 proguard 在 Android 上使 ORMLite 崩溃

android - Bitmap处理时如何避免 "out of memory exception"?

java.io.NotSerializedException : java. lang.reflect.Constructor