2012-06-12 76 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