使用Java将xml转换为json

问题描述:

有没有办法将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

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

在此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

你可以使用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

如果你正在使用的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。

存在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))); 
    } 
}