当前位置: 首页 > 知识库问答 >
问题:

如何在Gson中序列化列表对象

端木令
2023-03-14

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

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

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

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接口实现了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);
    }
}
Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);

共有1个答案

郎言
2023-03-14

我认为您不需要键入响应转换器,您可以直接使用一个新的Gson对象,就像响应转换器文档中的最后一段一样。结果会是这样的:

    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将涉及多态的对象序列化/反序列化为JSON。 这是我的序列化代码: 结果如下: 序列化大多的作品,除了它缺少继承成员的内容(尤其是和字符串丢失)。这是我的基类: 这是我的继承类(ObixOp)的样子: 我意识到我可以为此使用适配器,但是问题是我正在序列化基类type的集合。从中继承大约25个类。我该如何优雅地进行这项工作? 问题答案: 我认为自定义序列化器/反序列

  • 我正在尝试使用Gson将一个涉及多态性的对象序列化/反序列化为JSON。 这是我的序列化代码: 结果是这样的: 序列化主要工作,除了它缺少继承成员的内容(特别是和字符串丢失)。这是我的基类: 下面是我继承的类(ObixOp)的样子: 我意识到我可以使用适配器来实现这一点,但问题是我正在序列化一个基类类型的集合。大约有25个类继承自此。我怎样才能优雅地完成这项工作?

  • 主要内容:示例我们将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。 在这个例子中,创建一个类。 然后将对象列化后存储在文件中,该文件将具有对象的json表示形式。 示例 在中创建一个名为的Java类文件,参考以下代码 - 执行上面示例代码,得到以下结果 -

  • 问题内容: 我想使用套接字(在开发远程PC时)从Android客户端向Java服务器发送2个对象。 当然我知道上面的方法是行不通的,因为它可以提供。因此,现在我想知道如何使用Gson库对对象进行序列化和反序列化。提前致谢。 问题答案: gson可以在任何平台上与Java一起使用-不仅限于Android。 使用gson序列化单个对象: 使用gson反序列化为单个对象。 从示例中可以看到,gson非常

  • 问题内容: 我想编写一个通用函数,使用Gson反序列化通用类型List,下面是代码: 但是这段代码不起作用,我得到一个奇怪的结构,但是没有我的类型列表 当我使用时: 我工作,我得到了! 但是我需要一个通用函数,我该如何解决? 问候rubiktubik 问题答案: 没有将(as )的实际类型传递给您的方法,就无法做到这一点。 但是,如果显式传递它,则可以按如下所示创建for : 也可以看看:

  • 我的目标是让这个电话“只是工作”。