GSON 是一个 Java Throwable

2024-04-29

我有一个对象,其中包含一段数据和关联的异常。

Public class MyBean{
  Private String data;
  Private Exception problem;
.
.
.
}

当我尝试GSON.toJSON(对象)它给了我一个循环引用抱怨“问题”字段时出错。

GSON 有没有办法处理此类对象?


当尝试序列化原始问题中描述的数据结构时,Gson 确实抱怨循环引用错误。

下面的例子说明了这一点。

import com.google.gson.Gson;

public class GsonFoo
{
  public static void main(String[] args)
  {
    MyBean bean = new MyBean();
    bean.data = "some data";
    bean.problem = new RuntimeException("Ack!");

    System.out.println(new Gson().toJson(bean));
  }
}

class MyBean
{
  public String data;
  public Exception problem;
}

此示例会导致来自 Gson 的以下异常和消息。

Exception in thread "main" java.lang.IllegalStateException: circular reference error
  Offending field: cause

  Offending object: preserveType: false, type: class java.lang.Throwable, obj: java.lang.RuntimeException: Ack!
    at com.google.gson.CircularReferenceException.createDetailedException(CircularReferenceException.java:43)
    at com.google.gson.JsonSerializationVisitor.visitObjectField(JsonSerializationVisitor.java:117)
...

当尝试像下面这样简单的事情时,Gson 同样会窒息。

System.out.println(new Gson().toJson(new RuntimeException("Ack!")));

Gson 目前没有可用的配置来简单地解决这个问题。我建议将问题记录在http://code.google.com/p/google-gson/issues/list http://code.google.com/p/google-gson/issues/list.

如果一个对象带有Exception引用必须序列化,如果必须使用 Gson,则对引用进行自定义序列化处理Exception必须执行参考。以下是这样一个例子。

import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class GsonFoo
{
  public static void main(String[] args)
  {
    MyBean bean = new MyBean();
    bean.data = "some data";
    bean.problem = new RuntimeException("Ack!");

    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Exception.class, new ExceptionSerializer());
    Gson gson = gsonBuilder.create();

    System.out.println(gson.toJson(bean));
  }
}

class ExceptionSerializer implements JsonSerializer<Exception>
{
  @Override
  public JsonElement serialize(Exception src, Type typeOfSrc, JsonSerializationContext context)
  {
    JsonObject jsonObject = new JsonObject();
    jsonObject.add("cause", new JsonPrimitive(String.valueOf(src.getCause())));
    jsonObject.add("message", new JsonPrimitive(src.getMessage()));
    return jsonObject;
  }
}

class MyBean
{
  public String data;
  public Exception problem;
}

output:

{"data":"some data","problem":{"cause":"null","message":"Ack!"}}

物有所值,Jackson http://jackson.codehaus.org当尝试序列化相同的数据结构时,不会出现类似的阻塞。杰克逊连载了MyBean实例转换为 JSON,如下所示。

{
  "data":"some data",
  "problem":
  {
    "cause":null,
    "message":"Ack!",
    "localizedMessage":"Ack!",
    "stackTrace":
    [
      {
        "className":"com.stackoverflow.q8151082.JacksonFoo",
        "fileName":"JacksonFoo.java",
        "lineNumber":11,
        "methodName":"main",
        "nativeMethod":false
      }
    ]
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GSON 是一个 Java Throwable 的相关文章

随机推荐

  • 将 SSIM 损失函数与 Keras 结合使用

    我需要使用 Sewar 的 SSIM 作为损失函数 以便比较我的模型的图像 当我尝试编译模型时出现错误 我导入该函数并编译模型 如下所示 from sewar full ref import ssim model compile ssim
  • 滚动平均 pandas DataFrame 的所有值

    我有一个 pandas DataFrame 我想在滚动的基础上计算所有值的平均值 对于所有列 对于滚动窗口中的所有观察值 我有一个带循环的解决方案 但感觉效率很低 请注意 我可以有NaNs在我的数据中 因此计算总和并除以窗口的形状并不安全
  • 将升级锁排除在 N3568 提案之外的原因是什么

    我对此进行了一些谷歌搜索 但只找到了很少的信息 N3568 http www open std org jtc1 sc22 wg21 docs papers 2013 n3568 html Wording包括升级锁概念的规范 但升级部件当时
  • groovy 中具有默认值的命名参数

    是否可以在 groovy 中使用具有默认值的命名参数 我的计划是创建一种对象工厂 可以在没有任何参数的情况下调用它 以获得具有默认值的对象 另外 我需要显式设置对象的任何参数的功能 例如 我相信这可以通过 Python 关键字参数实现 我现
  • Java 相当于 C# 中带有 @ 的逐字字符串

    快问 Java 中是否存在应用于字符串的 等效项 例如我可以做 c afolder afile 在 C 中 让它在处理时忽略转义字符 而不必这样做 c afolder aFile Java 有等效的吗 嗯 stackoverflow 正在逃
  • 清单合并失败:属性 application@appComponentFactory

    一切都很好 但我正在尝试添加这个库https github com wdullaer MaterialDateTimePicker https github com wdullaer MaterialDateTimePicker有了这个 i
  • 增加字符串的最后一个字母

    这是我希望 Java 的 String 类有一个 ReplaceLast 方法的地方 但它没有 而且我的代码得到了错误的结果 我正在编写一个程序 该程序在数据结构中搜索与字符串前缀匹配的任何项目 但是 由于我使用的是迭代器 iter nex
  • Spring部署期间依赖注入问题

    我正在启动一个 Primefaces Spring Hibernate 项目 并且仍在学习如何正确处理这些组件 但就在此时 我面临着一个与 spring 依赖注入相关的问题 这让我很害怕 我已经在网上寻找答案两天了 但找不到我的代码有什么问
  • Groovy hasProperty/respondTo

    All the examples http mrhaki blogspot com 2009 10 groovy goodness check if method or html我看到使用hasProperty or respondsTo显
  • React Datepicker(无法获取输入值)

    我是反应新手 我需要使用反应日期选择器 https github com Hacker0x01 react datepicker 当我更改日期时 我想获取输入的值 如果我点击 2017 年 10 月 20 日 我想将 2017 年 10 月
  • 在 PLSQL Oracle 中抛出特定错误消息...在休眠中捕获?

    是否可以在 PL SQL oracle 存储过程中抛出特定的错误消息 并在调用它时在 Hibernate 中捕获它 您可以从 PL SQL 代码中抛出用户定义的错误消息 20000 到 20999 之间的错误代码保留用于用户指定的错误消息
  • 检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到形状为 (800, 1000) 的数组

    我正在尝试使用 CNN 进行情感分析 我的代码我的数据具有 1000 1000 形状 当我将数据传递给 convolution2D 时 它会抛出一个错误 我无法解决 我尝试了以下解决方案 但仍然面临问题 在构建 CNN 时 我收到 Kera
  • 在 PowerShell 中解析大型 JSON 文件

    Context 在这篇文章中 ConvertFrom Json 大文件 https stackoverflow com q 76784490 268581 我询问有关反序列化 1 2GB JSON 文件的问题 这个答案发布在那里 https
  • 如何在react-styleguidist中添加具有依赖项的示例组件

    我想记录一个ButtonGroup组件渲染Button其中使用 react styleguidist 的组件 我有一个 styleguidist webpack 配置 如下所示 module exports module rules tes
  • $(document).ready(function(){ 未捕获的 ReferenceError: $ 未定义

    您好 我在使用以下代码时遇到 未捕获的引用错误 未定义 目前我的日志中出现以下错误 我一直在查看框架中的示例 但似乎找不到错误在哪里 我已经有十多年没有做过任何 HTML 或 js 了 当时我所做的都是非常基本的东西 任何帮助 将不胜感激
  • Java的JConsole可以用来自动配置内存吗?

    我正在学习JavaJMX https docs oracle com javase tutorial jmx and JConsole http docs oracle com javase 7 docs technotes guides
  • 部署程序集:当前显示的页面包含无效值

    我从 Sourceforge 导入了一个 Java Web 应用程序 我花了三个工作周的时间来消除项目名称和包上附加的所有红叉 但现在我无法使该应用程序在我的 Eclipse 和 tomcat6 开发环境上运行 在项目属性中 当我尝试设置部
  • Eclipse JSP:默认文本文件编码不正确

    我有以下问题 我创建了一个新的 动态 Web 项目 并将一些现有的 jsp 文件导入其中 如果我右键单击导入的 jsp 文件之一 然后单击 属性 gt 资源 则在 文本文件编码 部分下 值为 默认 由内容类型确定 ISO 8859 1 不过
  • 带有图标和文本的 UITableViewRowAction

    有几个类似的问题 但我认为应该有一个针对 iOS 10 的最新答案 使用 Swift3 不使用私有 API 并且不依赖于将图标限制为 unicode表情符号 我现在有包含三个操作的表行 func tableView tableView UI
  • GSON 是一个 Java Throwable

    我有一个对象 其中包含一段数据和关联的异常 Public class MyBean Private String data Private Exception problem 当我尝试GSON toJSON 对象 它给了我一个循环引用抱怨