2012-08-23 74 views
9

我们正在寻找一种基于POJO(源或二进制)生成样本JSON片段的方式(可能是现有框架或类似方法)。例如:从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样本可能看起来像:

​​

什么想法?我们当然可以手动编码。只是想看看有没有东西。

回答

4

您还可以看看Gson(直接读/写域,无需getter/setter方法):

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

帮你一个忙,不要手动编码JSON(或XML,或者任何结构化的数据格式,如果你能避免的话)。这是不必要的重新发明轮子。有人已经完成了它,并已经为你解决了逃跑,嵌套和各种边界案例。

2

使用GSON

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

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

也有另一种称为Genson http://code.google.com/p/genson/库。

其实Genson速度更快,功能比Gson更多,并且性能接近杰克逊(但其重量更轻),请参阅http://code.google.com/p/genson/wiki/Metrics。它使用àapi api而不是dom模型,它具有更好的可伸缩性,并且在web应用程序中可以在输入到达时处理转换。

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

它的最新版本(0.91)可以在maven中央仓库中找到。

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

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

编辑 关于Gson和Jackson的几句话。我已经使用了超过2年的杰克逊和一点Gson。首先要注意的是,杰克逊是最快的json/java库(Gesnon试图打败它,但它很难)。杰克逊还有很多功能和配置可能性(大多数基于注释)。我有杰克逊的标准和高级用法,直到我需要杰克逊没有提供的功能时,它才是好的。我发现图书馆真的很难扩展(对于我的用例来说,如果不重写大部分内容,这是不可能的)。

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

如果你不想使用Genson,我真的推荐你Jackson在Gson上。

2

备注:我是EclipseLink JAXB (MOXy)的领导者,也是JAXB (JSR-222)专家组的成员。

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

jaxb.properties

要指定莫西为您的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实例输出的JSON。注意如何使用标准的JAXB API。在JAXB的API已经在JDK/RE自从Java SE 6

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" 
} 

更多信息

0

您可以使用Gson来做到这一点。

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

检查this链接的详细解释还怎么做,在JS/ExtJS的,也从反序列化JSON POJO到