2015-02-11 178 views
4

有沒有辦法將xml文件轉換爲json? XML可以是任何結構,因此沒有實例化的POJO類。我需要將xml轉換爲json或Map,沒有根節點。使用Java將xml轉換爲json

例如:

<import name="person"> 
    <item> 
     <firstName>Emil</firstName> 
     <lastName>Example</lastName> 
     <addresses> 
      <address> 
       <street>Example Blvd.</street> 
      </address> 
      <address> 
       <street>Example Ave.</street> 
      </address> 
     </addresses> 
    </item> 
</import> 

預期JSON

{ 
    "firstName": "Emil", 
    "lastName": "Example", 
    "addresses": [ 
     { "street" : "Example Blvd." }, 
     { "street" : "Example Ave." } 
    ] 
} 
+2

你聽說過SAX和DOM解析器的?使用基本的XML解析應該相當容易。 – Smutje 2015-02-11 10:02:38

+1

沒有從XML到JSON的canocical映射。什麼是屬性或命名空間?包含文本和其他元素的元素是什麼? – 2015-02-11 10:08:24

+2

可能的重複[在Java中將XML轉換爲JSON的最快捷方式](http://stackoverflow.com/questions/1823264/quickest-way-to-convert-xml-to-json-in-java) – Joe 2015-02-11 10:19:54

回答

11
import org.json.JSONException; 
import org.json.JSONObject; 
import org.json.XML; 

XML.toJSONObject(xml_text).toString() 

org.json.XML

+1

如果有人想知道如何獲得這個庫jar,在這裏你去:https://mvnrepository.com/artifact/org.json/json/ – 2017-11-10 15:21:41

1

在此website您找到適合您的任務一些有用的類。

public class Main { 

    public static int PRETTY_PRINT_INDENT_FACTOR = 4; 
    public static String TEST_XML_STRING = "Your xml string here"; 

    public static void main(String[] args) { 
     try { 
      JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING); 
      String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR); 
      System.out.println(jsonPrettyPrintString); 
     } catch (JSONException je) { 
      System.out.println(je.toString()); 
     } 
    } 
} 
+0

鏈接關閉 – 2017-08-29 14:05:48

+0

是的,鏈接已關閉,但http://www.json.org /包含一個包含所有可用開源庫的「Java」部分來處理JSON。我用這個庫:https://mvnrepository.com/artifact/org.json/json/ – 2017-11-10 15:17:37

8

你可以使用JSON和XML庫從json.org

import org.json.JSONObject; 
import org.json.XML; 
import org.junit.Test; 

public class XmlToJsonTest { 
    private static final String XML_TEXT = "<note>\n" + 
      "<to>Tove</to>\n" + 
      "<from>Jani</from>\n" + 
      "<heading>Reminder</heading>\n" + 
      "<body>Don't forget me this weekend!</body>\n" + 
      "</note>"; 
    private static final int PRETTY_PRINT_INDENT_FACTOR = 4; 

    @Test 
    public void convert() { 
     JSONObject xmlJSONObj = XML.toJSONObject(XML_TEXT); 
     String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR); 
     System.out.println(jsonPrettyPrintString); 
    } 
} 

來源

<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 

輸出

{"note": { 
    "heading": "Reminder", 
    "from": "Jani", 
    "to": "Tove", 
    "body": "Don't forget me this weekend!" 
}} 
+0

這不是我想要的(「沒有根節點」)。 – Dominic 2015-02-11 11:10:52

+1

只需刪除第一個和最後一個符號) – 2015-02-11 11:53:21

3

如果你正在使用的Java ,你應該看看我的開源庫:unXml。 unXml基本上從Xpaths映射到Json屬性。

它在Maven Central上可用。

import com.fasterxml.jackson.databind.node.ObjectNode; 
import com.nerdforge.unxml.factory.ParsingFactory; 
import com.nerdforge.unxml.parsers.Parser; 
import org.w3c.dom.Document; 

public class ParserExample { 
    public ObjectNode parseXml(String xml){ 
     Parsing parsing = ParsingFactory.getInstance().create(); 
     Document document = parsing.xml().document(xml); 

     Parser<ObjectNode> parser = parsing.obj("//item") 
      .attribute("firstName", "firstName") 
      .attribute("lastName", "lastName") 
      .attribute("addresses", parsing.arr("addresses/address", parsing.obj() 
       .attribute("street", "street") 
      )) 
      .build(); 

     ObjectNode result = parser.apply(document); 
     return result; 
    } 
} 

它會返回一個JacksonObjectNode,從您的示例JSON。

0

存在underscore-lodash庫,其中有來自XML和toJson的靜態方法。

代碼示例:

import com.github.underscore.lodash.$; 
import java.util.Map; 
import org.junit.Test; 
import static org.junit.Assert.assertEquals; 

public class StringTest { 

    @SuppressWarnings("unchecked") 
    @Test 
    public void toXmlFromJson() { 
     final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n" 
      + " <FirstItem>1</FirstItem>\n <SecondItem>2</SecondItem>\n</root>"; 
     assertEquals("{\n" 
      + " \"root\": {\n" 
      + " \"FirstItem\": \"1\",\n" 
      + " \"SecondItem\": \"2\"\n" 
      + " }\n" 
      + "}", 
      $.toJson((Map<String, Object>) $.fromXml(xml))); 
    } 
}