【问题标题】:How to marshall POJO to JSON using JETTISON?如何使用 JETTISON 将 POJO 编组为 JSON?
【发布时间】:2013-03-03 19:51:17
【问题描述】:

我已经使用 JETTISON 将 JaxB java 对象编组到 Json。但是我不能使用 JETTISON 将简单的 java 对象(其中没有注释)编组到 Json。我知道可以通过使用 GSON 或 MOXy 或其他一些提供商来做到这一点。

但我想明确“我们可以使用 JETTISON 来实现吗?”。如果可以,该怎么做?

提前致谢。

【问题讨论】:

    标签: java json jakarta-ee marshalling jettison


    【解决方案1】:

    不要浪费您的时间,这根本不是 Jettison 的设计初衷。可以想象,使用 POJO 实例化 JSONObject 并以这种方式序列化它是可能的,但它的代码存在一些问题,这使得这几乎是不可能的:

    1. 它需要传入将包含在 JSON 中的字段的名称。
    2. 它只能处理所提供对象的公共属性。

    更不用说它不能处理任何类型的嵌套。看看这个可爱的代码:

    Class c = object.getClass();
    for (int i = 0; i < names.length; i += 1) {
            try {
                    String name = names[i];
                    Field field = c.getField(name);
                    Object value = field.get(object);
                    this.put(name, value);
            } catch (Exception e) {
                    /* forget about it */
            }
    }
    

    是的,这就是构造函数JSONObject(Object, String[]) 中的代码。我相信你会看到它的问题(对通用对象的原始访问,只能访问公共字段,草率的异常处理)。总而言之 - 非常糟糕的“序列化”代码。

    我知道这可能不是您想听到的,但如果您想将常规 Java 对象转换为 JSON,那么您可能想坚持使用更通用的库之一。

    【讨论】:

      【解决方案2】:

      JAXB (JSR-222) 是异常配置,只需要在需要覆盖默认 XML 表示的地方进行注释(Jettison 将 XML StAX 事件转换为 JSON 或从 JSON 转换)。您可以将对象包装在 JAXBElement 的实例中,而不是 @XmlRootElement

      【讨论】:

      • Thnks Blaise:如果我将对象包装在 JAXBElement 中,它将充当 JAXB(我认为)。但我不需要它。我需要按原样将 POJO 编组为 JSON。有可能吗??
      • @VijayKumar - Jettison 无法直接将对象转换为 JSON。由于它将 StAX 事件转换为 JSON 或从 JSON 转换,它可以与 XML 绑定工具(JAXB 是标准)一起使用以从对象生成 JSON。如果这是您的环境正在做的事情,那么使用 JAXBElement 是正确的做法。
      • 是的。,但有时我可能需要编组具有@Entity 注释的对象。在这种情况下,如果我尝试将其包装在 JAXBElement 中会发生冲突。
      • @VijayKumar - 哪个库提供@Entity 注释?您的用例中涉及多少个 JSON 绑定框架?
      • 应该只有一个框架可以毫无问题地编组任何 java 对象。我已经完成了 GSON 并且效果很好。所以我尝试了 JETTISON。但我仍然无法得到它。
      猜你喜欢
      • 2011-12-19
      • 2013-03-02
      • 1970-01-01
      • 2013-12-25
      • 2011-02-21
      • 2015-12-14
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多