2016-04-03 138 views
0

我使用org.json庫,如下圖所示,從XML轉換成JSONXML到JSON產生意想不到的結果

<dependency> 
     <groupId>org.json</groupId> 
     <artifactId>json</artifactId> 
     <version>20160212</version> 
    </dependency> 

一個簡單的測試案例說明我有這個問題,見下圖: -

我有下面的XML

<record> 
    <name>A108B</name> 
</record> 

反過來,產生

{"record": { "id": "A108B" }} 

太棒了!如果id

出現該問題的使用下面的代碼

XML.toJSONObject(xml...) 

我得到

{"record": { "name": 1111 }} 

其實我更願意保持值的所有字符串,即用戶標識符。我不希望輸出的變化取決於標識符是否恰好沒有字符。

有什麼辦法可以強制org.json來做到這一點?我大概可以分叉代碼併爲自己做一些改變,但我希望這是別人遇到的問題,並且有解決方案。

+0

在http://www.utilities-online.info/xmltojson/#.VwFtQBMrJmB工具似乎轉換我怎麼會喜歡看。 – chrisw

回答

1

這似乎這樣的伎倆,我不得不重寫JSONTokener的nextValue

String xml = "<test>111</test>"; 
    JSONObject json = XML.toJSONObject(xml); 
    JSONTokener tokener = new JSONTokener(json.toString()) { 
     public Object nextValue() throws JSONException { 
      Object nextValue = super.nextValue(); 
      if (nextValue instanceof Number) { 
       Number value = (Number) nextValue; 
       return value.toString(); 
      } 
      return nextValue; 
     } 
    }; 
    json = new JSONObject(tokener); 
    System.out.println(json.toString()); 

輸出:{"test":"111"}

0

XML.toJSONObject(...)內部調用static Object stringToValue(String string)總是嘗試將值轉換爲BooleanJSONObject.NullLongDouble第一,並返回一個String只有當所有的轉換嘗試失敗。似乎沒有(容易)解決這個問題。

相反分叉或做一些反思神奇的,你可以簡單地閱讀時,轉換價值:

JSONObject rec = json.getJSONObject("record"); 
String name = rec 
       .get("name") 
       .toString(); 

// optionally put the string value back into your JSON: 
rec.put("name", name); 
+0

不幸的是,我做的測試用例極大地簡化了xml/json。如果我要遍歷整個層次結構,我可能會更好地寫我自己的XML到JSON轉換器 – chrisw

+0

@chrisw我想那麼你最好的選擇將複製'XML'工具類,並替換'靜態對象stringToValue(字符串字符串)'方法與你自己的實現。 – nyname00

相關問題