2012-06-12 62 views
5

我很新的JSON和我的目标是创建的JSON的Java bean下面的输出。我应该如何构造我的Java对象?我应该有MyResult类和用户和结果作为子类吗?我可以使用什么Json库?JSON - Java对象到JSON

“MyResult” { 
    “AccountID”: “12345”, 
    "User" { 
     "Name": "blah blah", 
     "Email": “[email protected]”, 
    }, 
    "Result" { 
     "Course": “blah”, 
     "Score": “10.0” 
    } 
} 
+0

感谢您的回复。如果我在杰克逊设计这个,我的Java对象应该如何看待? – user238021

回答

9

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


我应该如何构建我的Java对象?

下面是你的对象模型可能是什么样子。 MOXy的JSON绑定利用JAXB注释将域模型映射到JSON,所以我也包含了这些。 JAXB实现具有映射字段/属性名称的默认规则,但由于文档不同于默认,所以每个字段都必须注释。

MyResult

package forum11001458; 

import javax.xml.bind.annotation.*; 

@XmlRootElement(name="MyResult") 
public class MyResult { 

    @XmlElement(name="AccountID") 
    private String accountID; 

    @XmlElement(name="User") 
    private User user; 

    @XmlElement(name="Result") 
    private Result result; 

} 

用户

package forum11001458; 

import javax.xml.bind.annotation.XmlElement; 

public class User { 

    @XmlElement(name="Name") 
    private String name; 

    @XmlElement(name="Email") 
    private String email; 

} 

结果

package forum11001458; 

import javax.xml.bind.annotation.XmlElement; 

public class Result { 

    @XmlElement(name="Course") 
    private String course; 

    @XmlElement(name="Score") 
    private String score; 

} 

我可以使用哪些JSON库这个?

下面是你如何使用莫西做JSON绑定:

JAXB。性能

要使用莫西为您的JAXB提供你需要包括一个在同一包以下项为您的域模型称为jaxb.properties文件:

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

演示

注意如何MOXy的JSON绑定不需要任何编译时间依赖性。所有必要的API在Java中可用SE 6,你可以添加必要的支持的API,如果你使用的是Java SE 5

package forum11001458; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setProperty("eclipselink.media-type", "application/json"); 
     File json = new File("src/forum11001458/input.json"); 
     Object myResult = unmarshaller.unmarshal(json); 

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

} 

input.json /输出

{ 
    "MyResult" : { 
     "AccountID" : "12345", 
     "User" : { 
     "Name" : "blah blah", 
     "Email" : "[email protected]" 
     }, 
     "Result" : { 
     "Course" : "blah", 
     "Score" : "10.0" 
     } 
    } 
} 
7

Googles GSON是一个非常好的JSON库。 This是从以前的链接,它基本上概括了它的一些功能。

5

jackson也相当快,使用方便

+0

感谢您的回复。如果我在杰克逊设计这个,我的Java对象应该如何看待? – user238021

1

虽然封闭,this SO post可以帮助您了解杰克逊和GSON之间的差异。哪一个是“最好的”取决于什么对你很重要。

编辑:专门为杰克逊,你的例子看起来很像他们给了他们所谓的完全数据绑定的例子,你可以读取它here。顺便说一句,虽然以读取文件需要公布5分钟也许是有点短,它给不同的方式杰克逊可以使用完整的概述。您还会注意到给出的示例不使用注释。

1

或者GSON

超级简单(没有getter/settres,没有注释或配置需要)。

class BagOfPrimitives { 
    private int value1 = 1; 
    private String value2 = "abc"; 
    private transient int value3 = 3; 
} 

BagOfPrimitives obj = new BagOfPrimitives(); 
Gson gson = new Gson(); 
String json = gson.toJson(obj); 

==> json is {"value1":1,"value2":"abc"} 
+0

我现在看到了@fvu所说的大致相同。无论如何。 – ses