【问题标题】:How to serialize List object in Gson如何在 Gson 中序列化 List 对象
【发布时间】:2017-08-19 08:01:59
【问题描述】:

我使用以下方法(来自spark-java framework 的方法)从数据库返回数据:

get("/data_on_page_load", "application/json", (Request request, Response response) -> {
    List<Post> list = Post.findAll(); // NEED TO SERIALIZE THE RESPONSE
    System.out.println("list is  " + list);
    return (list);
}, new JsonTransformer());

从数据库返回的数据:

 [Model: com.soul.seeker.models.Post, table: 'post', attributes: {created_at=2017-03-26 04:06:35.0, details=aaa, id=36, title=Eventsa, url=eventsa, userImage=assets/img/spiritual-icon4.png, username=null}]

其中 Post.findAll(); 是来自http://javalite.io/record_selection#finding-all-records 获取所有记录的方法

Model: com.soul.seeker.models.Post 是下面的 POJO 类:

public class Post extends Model{
   private String title;
   private String details;
   private String username;
   private String userImage;
   private String url;
   private List categories;

   //Getters and Setters removed for brevity
}

我正在尝试使用 GSON TypeTokenTypeAdapter 序列化输出

ClassTypeAdapterFactory:

public class ClassTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {

        if(!Class.class.isAssignableFrom(typeToken.getRawType())) {
            return null;
        }

        return (TypeAdapter<T>) new ClassTypeAdapter();
    }
}

类类型适配器:

public class ClassTypeAdapter extends TypeAdapter<Class<?>> {
    @Override
    public void write(JsonWriter jsonWriter, Class<?> clazz) throws IOException {
        if(clazz == null){
            jsonWriter.nullValue();
            return;
        }
        jsonWriter.value(clazz.getName());
    }

    @Override
    public Class<?> read(JsonReader jsonReader) throws IOException {
        if (jsonReader.peek() == JsonToken.NULL) {
            jsonReader.nextNull();
            return null;
        }
        Class<?> clazz = null;
        try {
            clazz = Class.forName(jsonReader.nextString());
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return clazz;
    }
}

这里我使用的是JsonTransformer,它从spark-java ResponseTransformer interface实现ResponseTransformer

public class JsonTransformer implements ResponseTransformer {

    private Gson gson = new Gson();

    @Override
    public String render(Object model) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gson = gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory()).create();
        return gson.toJson(model);
    }
}

现在的问题是输出的 json 也包含序列化的类,而不是只返回 pojo 类的 List 对象。我是 Java 和 Gson 序列化的新手。

任何人都可以帮助实现 TypeAdapter 以仅返回 List 对象吗?例如这样的:

Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);

【问题讨论】:

    标签: java json serialization gson spark-java


    【解决方案1】:

    我认为您不需要键入响应转换器,您可以直接使用新的 Gson 对象,就像 response transformer documentation 的最后一个 sn-p 一样。最终会是这样:

        get("/data_on_page_load", (req, res) -> {
            res.type("application/json; charset=UTF-8");
            List<Post> list = Post.findAll();
            System.out.println("list is  " + list);
            return list;
        }, new Gson()::toJson);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多