2011-04-13 35 views
0

在新澤西州的RESTful框架的工作,我知道我可以在客戶端獲取XML數據如下:獲取XML數據後,如何解析並傳輸到JSON?

private static final String BaseURI = "http://DOMAN.com"; 

ClientConfig config = new DefaultClientConfig(); 

Client client = Client.create(config); 

WebResource service = client.resource(BaseURI); 

String xmlData = service.path("rest").path("todos").accept(
       MediaType.APPLICATION_XML).get(String.class) 

我的問題是我怎麼能解析xmlData呢?我想從xmlData獲取所需的數據,並將所需的數據傳輸到JSON,實現此目的的最佳方法是什麼?

+1

爲什麼不直接向Jersey請求數據的json表示? – 2011-04-13 14:16:14

+0

由於低層接口轉移到我xml數據,我需要轉換爲json – Mellon 2011-04-13 14:20:12

+0

您可以使用薩克斯或Dom分析器來解析數據 – Premraj 2011-04-13 14:27:43

回答

0

簡單,最簡單的方法就是使用org.json包:http://json.org/javadoc/org/json/XML.html

XML.toJSONObject(xmlData).toString() 

就這一個除了必要的import語句行做這一切。

現在我已經提到了org.json庫,很多人可能對它評論不好。請記住,我說的最簡單和最簡單的方式,沒有最好或最高效的方式;-)

在你使用maven情況下,添加這種依賴性:

<dependency> 
    <groupId>org.json</groupId> 
    <artifactId>json</artifactId> 
    <version>20090211</version> 
</dependency> 
0

如果你的服務不提供JSON作爲選項(如果將MediaType.APPLICATION_XML更改爲MediaType.APPLICATION_JSON,會發生什麼情況?),那麼我相信您有幾個選項,我按照自己的偏好排列。

選擇1:你的數據 如果你對返回的XML的XML架構,您可以使用XJC生成JAXB註解的Java類,然後利用jackson的情況下轉換成JSON數據的XML模式。我認爲這會讓你通過利用這些庫來解析你自己而快速發展。 Jackson是一個功能強大的庫,被glassfish用於他們的澤西島(JAX-RS)實施,我不覺得依靠這個庫有任何風險。

選項2:使用json.org庫,但是我已經遇到了很大的問題,這個庫必須使用基於反射的方法等等。也就是說,它可能適合你......而你可以相對容易地測試,看看它是否符合您的要求。如果是這樣......你完成了! =)

選項3:您沒有XML架構和/或您希望更多控制 作爲@Falcon指出的,您始終可以使用傳統的XML解析技術將XML解析爲任何您想要的內容。我偏愛SAX解析,但DOM可以根據XML側

問候工作,

史蒂夫

+0

嗨,謝謝你的答案,你可以提供一個例子或教程爲您的選項1 ? – Mellon 2011-04-13 18:10:17

+0

@Steve Siebert,我會等待你的進一步迴應,謝謝。 – Mellon 2011-04-14 06:36:50

+0

@Mellon - 是的,沒問題。我開始寫一篇實際的教程,並且希望確保這個場景能夠覆蓋你正在尋找的內容,因爲它也可以用於本地培訓。 您正在編寫一個移動應用程序,需要使用僅提供XML的第三方RESTful Web服務。爲了節省帶寬和處理,您決定使用Jersey創建一個RESTful代理,該代理從您的移動應用接收請求,向第三方RESTful端點發出請求並返回JSON。 你相信這會滿足你的需求嗎? – 2011-04-14 07:18:15

0

你有到生成XML的「下級界面」任何訪問?如果你這樣做,唯一需要改變的是使用「@XmlRootElement」註解xml對象。然後,您可以將XMLobject作爲JSON傳回,而無需任何其他代碼。

0

檢查Jsonix。如果您有XML模式,則可以使用JavaScript生成XML-JSON映射和解組/編組XML。與JAXB非常相似(Steve Siebert提到),但對客戶端有效。

// The PO variable provides Jsonix mappings for the purchase order test case 
// Its definition will be shown in the next section 

var PO = { }; 

// ... Declaration of Jsonix mappings for the purchase order schema ... 

// First we construct a Jsonix context - a factory for unmarshaller (parser) 
// and marshaller (serializer) 
var context = new Jsonix.Context([ PO ]); 

// Then we create an unmarshaller 
var unmarshaller = context.createUnmarshaller(); 

// Unmarshal an object from the XML retrieved from the URL 
unmarshaller.unmarshalURL('/org/hisrc/jsonix/samples/po/test/po-0.xml', 
    // This callback function will be provided with the result 
    // of the unmarshalling 
    function(result) { 
     // We just check that we get the values we expect 
     assertEquals('Alice Smith', result.value.shipTo.name); 
     assertEquals('Baby Monitor', result.value.item[1].productName); 
    }); 
1

作爲一般規則,如果不需要,不要將直接從XML轉換爲JSON(反之亦然)。 而是將數據從XML或JSON綁定到POJO,然後執行其他轉換。雖然看起來可能並不直觀,但這會導致更清晰的結果和更少的問題,因爲POJO和數據格式之間的轉換具有更多選項,成熟且設計良好的庫;和POJO更容易配置(帶有註釋)並具有更多元數據來指導轉換過程。 直接轉換庫(像Jettison,見下文)受各種問題困擾;通常會生成「franken-JSON」,這在技術上是正確的,但由於添加了轉換所需的構造,所以看起來很陌生。

在Jersey的情況下,然後使用JAXB作爲POJO的XML,Jackson與JSON一樣。這些是澤西使用的圖書館;直接使用非常簡單。如果你絕對堅持直接轉換,你可以嘗試Jettison,但是如果你需要它們,準備好用列表,數組和地圖來解決問題(特別是單元素數組 - 數組對XML有問題,並且自動轉換經常出錯)。