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

关于使用Gson将hibernate对象序列化到json

程阳平
2023-03-14
public class CustomTypeAdapter implements JsonSerializer<Object> {

@Override
public JsonElement serialize(Object object, Type type, JsonSerializationContext jsc) {
    JsonObject jsonObject = new JsonObject();
    try {
        Map<String, String> properties = BeanUtils.describe(object);
        //org.apache.commons.beanutils
        for (Map.Entry<String, String> entry : properties.entrySet()) {
            jsonObject.addProperty(entry.getKey(),  entry.getValue());
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return jsonObject;
    }

}
List<ProductHasSize> phsList = s.createCriteria(ProductHasSize.class, "phs")
                .createAlias("phs.product", "product")
                .add(Restrictions.eq("product.id", 1))
                .list();
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gson = gsonBuilder.registerTypeAdapter(ProductHasSize.class, new CustomTypeAdapter()).create();
        String element = gson.toJson(phsList);
        response.getWriter().write(element);
[{"product":"com.certus.dbmodel.Product@54554356","size":"com.certus.dbmodel.Size@215a88a","price":"1250.0","qnty":"20","id":"1","class":"class com.certus.dbmodel.ProductHasSize"},{"product":"com.certus.dbmodel.Product@54554356","size":"com.certus.dbmodel.Size@2eab455a","price":"1300.0","qnty":"5","id":"2","class":"class com.certus.dbmodel.ProductHasSize"}]

提前谢了。

共有1个答案

陶柏
2023-03-14

beanutils.description没有提供足够的信息。如果所有类型都是原语就好了。

您必须独立地序列化每个属性。对于非基元类型的字段,对其进行序列化。您还必须为实际类型创建适配器,以便访问其属性。

public class CustomTypeAdapter implements JsonSerializer<ProductHasSize> {

@Override
public JsonElement serialize(ProductHasSize phs, Type type, JsonSerializationContext jsc) {

    JsonObject jsonObject = new JsonObject();
//    try {
//        Map<String, String> properties = BeanUtils.describe(object);
//        //org.apache.commons.beanutils
//        for (Map.Entry<String, String> entry : properties.entrySet()) {
//            jsonObject.addProperty(entry.getKey(),  entry.getValue());
//        }
//    } catch (Exception ex) {
//        ex.printStackTrace();
//    }
    jsonObject.addProperty("price", phs.getPrice());
    jsonObject.addProperty("quantity", phs.getQuantity());
    JsonElement jsonProduct = jsc.serialize(phs.getProduct());
    jsonObject.add("product", jsonProduct);
    JsonElement jsonSize = jsc.serialize(phs.getSize());
    jsonObject.add("size", jsonSize);

    return jsonObject;
    }

}

这个页面有一个很好的介绍:http://www.javacreed.com/gson-serialiser-example/

 类似资料:
  • 问题内容: 我想将此对象序列化为JSON字符串 并获得如下结果: 我尝试使用 但是相反,我得到了: 人员序列化器: 欢迎任何建议 谢谢,马里奥 问题答案: 为了获得所需的结果,您需要像这样编写串行器: 的结果 将会 完整的代码:

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

  • 我想将这个对象序列化为JSON字符串 并得到如下结果: 我试着用 但不是这样,我得到了: 个性化序列化: 欢迎提出任何建议 谢谢,马里奥

  • 问题内容: 我有一个名为的类,该类具有一个作为参数的构造函数: 具有以下属性: 并且是我的应用程序的其他类,并具有以下构造函数: ,并且是的子类。 我想用Gson 反序列化数组,所以我写道: 以定义为: 调试时,实例具有正确的“ MainActivity”作为上下文,而其成员变量的上下文为null。 Gson 使用正确的构造函数创建了对象,但使用默认的无参数构造函数创建了实例。我怎样才能解决这个问

  • 我有一个名为PageItem的类,它有一个构造函数,该构造函数将上下文作为参数: 具有以下属性: 新闻提供者(Newsprovider)和主题(Topic)是我的应用程序的其他类,具有以下构造函数:

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