11

我们正在寻找一种方法(可能是现有框架或类似框架)来基于 POJO(源代码或二进制文件)生成示例 JSON 片段。例如:

public class foo {
   String var1;
   String var2;

   public String getVar1() { return var1; }
   public void setVar1(String var1) { this.var1 = var1; }

   public String getVar2() { return var2; }
   public void setVar2(String var2) { this.var2 = var2; }
}

会产生一个 JSON 样本,如下所示:

{
  "var1": "string1",
  "var2": "string2"
}

有任何想法吗?我们当然可以手动编写代码。只是想看看那里是否已经有东西了。

4

6 回答 6

4

还有另一个名为 Genson 的库http://code.google.com/p/genson/

实际上,Genson 比 Gson 更快,具有更多功能,并且性能接近 jackson(但它更轻量级),请参见http://code.google.com/p/genson/wiki/Metrics。它使用流式 api 而不是 dom 模型,带来更好的可扩展性,并且在 Web 应用程序中很好,您可以在输入到达时处理转换。

Genson 非常适合各种用例,从简单的转换到所有流程的完全定制。您可以配置很多东西(使用字段和/或方法,使用带参数且不带任何注释的构造函数,按可见性过滤属性等等)。你应该看看维基。

它的最新版本 (0.91) 在 maven 中央存储库中可用。

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>0.91</version>
</dependency>

免责声明:我是图书馆的作者,但我尽量做到客观(尤其是在基准测试中)。

编辑 关于 Gson 和 Jackson 的几句话。我已经使用 Jackson 2 年多了,还有一点 Gson。首先要注意的是,Jackson 是目前最快的 json/java 库(Gesnon 试图击败它,但它很难)。Jackson 还有很多功能和配置可能性(大多数基于注释)。我对 Jackson 有标准和高级的使用,在我需要 Jackson 没有提供的功能之前,这很好。我发现这个库真的很难扩展(对于我的用例,如果不重写大部分是不可能的)。

然后我尝试了Gson。关于 Gson,首先要注意的是它不使用 getter/setter,而只使用字段!它的表现并不好(尤其是与杰克逊或根森相比)。随着最新版本的改进,它们还提供了流式 API,但仍然不够快。一开始,它的主要优势是对 Java 泛型的良好支持,但 Jackson 和 Genson 也提供了它。另请注意,Gson 的开箱即用功能比 Genson 或 Jackson 少。我还尝试在 Gson 中实现我需要的功能,但我发现 Beans 数据绑定部分不可扩展(几乎没有扩展点的单个类中的所有内容),所以我必须重写它。这是毫无疑问的,这就是我最终创建 Genson 的方式。

如果您不想使用 Genson,我真的建议您使用 Jackson 而不是 Gson。

于 2012-08-24T10:11:12.133 回答
3

你也可以看看Gson(它直接读/写字段,不需要 getter/setter):

Foo foo = ...
Gson gson = new Gson();
String json = gson.toJson(foo);

帮自己一个忙,不要手动编码 JSON(或 XML,或任何可以避免的结构化数据格式)。这是不必要的重新发明轮子。以前有人做过,已经为你解决了逃逸、嵌套和各种边界情况。

于 2012-08-23T22:54:00.100 回答
2

见这里:http: //jackson.codehaus.org/

快速入门指南:http ://wiki.fasterxml.com/JacksonInFiveMinutes

于 2012-08-23T22:46:39.673 回答
1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

您可以使用EclipseLink JAXB (MOXy)将您的对象模型转换为 JSON(和/或 XML)。下面是一个完整的例子。

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要包含一个jaxb.properties在与域模型相同的包中调用的文件,其中包含以下条目(请参阅: http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -your.html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

下面的演示代码可用于从foo. 请注意如何仅使用标准 JAXB API。自 Java SE 6 以来,JAXB API 一直在 JDK/RE 中。

package forum12101023;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(foo.class);

        foo foo = new foo();
        foo.setVar1("string1");
        foo.setVar2("string2");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

输出

{
   "var1" : "string1",
   "var2" : "string2"
}

了解更多信息

于 2012-08-24T10:54:14.430 回答
1

使用GSON

Foo foo = new Foo();
foo.setVar1("string1");
foo.setVar2("string2");

Gson gson = new Gson();      
String json = gson.toJson(foo);
于 2012-08-23T22:54:35.617 回答
-1

您可以使用 Gson 来执行此操作。

Gson gson = new Gson();   
String fooJSON= gson.toJson(foo);  

检查链接以获取详细说明以及如何在 JS/Extjs 中执行此操作以及从 JSON 反序列化为 POJO

于 2013-06-10T16:46:33.320 回答