如何在Gson中序列化List对象 [英] How to serialize List object in Gson

查看:1060
本文介绍了如何在Gson中序列化List对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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 TypeToken TypeAdapter

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();
    }
}

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接口

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);

解决方案

我认为您无需键入Response Transformer,您可以像在

I have data returned from DB using the below method (method from spark-java framework) below:

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());

Data returned from DB:

 [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}]

Where Post.findAll(); is method from http://javalite.io/record_selection#finding-all-records to get all records

Model: com.soul.seeker.models.Post is the POJO class below:

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
}

I am trying to serialize the out put using GSON TypeToken and TypeAdapter

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();
    }
}

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;
    }
}

Here I am using JsonTransformer which implements ResponseTransformer from spark-java ResponseTransformer interface

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);
    }
}

Now the problem is the json out put also contains serialized class instead of only returning List object of pojo class. I am new to Java & Gson serialization.

Can any one please help in implementing TypeAdapter to return only List object? for Example like this:

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

解决方案

I think that you won't need to type a Response Transformer, you can use a new Gson object directly like the last snippet at the response transformer documentation. It would end up like this:

    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);

这篇关于如何在Gson中序列化List对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆