Java中的XML到json转换,同时保留数据类型

时间:2011-12-01 06:54:14

标签: java xml json

我使用org.json api将xml转换为json。问题是我的xml中的某些标记包含非字符串值(即int,boolean,double等...)。

我在下面使用的代码成功地将xml转换为json,但原始数据类型在json响应中转换为字符串。例如:xml中的<age>10<age>转换为{"age" : "10" },其中json中的值10String,应为Integer。例如{"age" : 10 }

我为转换提供的xml输入是动态的,会经常更改。但为了显示它作为示例,我将xml保存为String。动态生成的xml代码将保存在字符串变量中。

任何人都可以帮我解决将xml转换为json,同时保留数据类型的问题吗?以下是代码

import org.json.*;
public class XmlToJson {
     private static String xmlCode = 
                     "<handler>
                         <price>10</price>
                         <item>rice</item>
                         <VALUE>3434</VALUE>
                     </handler>
                     <flow>
                     </flow>";
         public static void main(String[] args) throws JSONException{
               JSONObject xmlJsonObj=null;
               xmlJsonObj = XML.toJSONObject(xmlCode);
               System.out.println(xmlJsonObj.toString(1));
         }
}

示例输出:

{
    "flow": "",
    "handler": {
        "VALUE": "3434",
        "item": "rice",
        "price": "10"
    }
}

预期的行为是:

{
    "flow": "",
    "handler": {
        "VALUE": 3434,
        "item": "rice",
        "price": 10
    }
}

3 个答案:

答案 0 :(得分:2)

如果您的架构已设置,您可以通过POJO进行数据绑定(将XML转换为JSO, 将POJO转换为JSON) - 有很多数据绑定工具,我会推荐那些在pull-model(XStream for XML,GSON for JSON)之上工作的工具 - 但是有一个丰富的选择 给你最喜欢的人

如果您在XML方面做得更好,您还可以编写XSLT转换,将XML转换为您喜欢的任何内容,也可以转换为JSON - 尽管我个人认为JavaBeans更容易

答案 1 :(得分:2)

您应该查看我的开源库unXml,它解析xml并输出Json。它是为Java 8编写的,并使用(真棒)Jackson Json库。

UnXml可在Maven Central上找到。

给定这个xml(添加了一个根以便做好)

<root>
    <handler>
        <price>10</price>
        <item>rice</item>
        <VALUE>3434</VALUE>
    </handler>
    <flow></flow>
</root>

您可以像这样创建一个解析器

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

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

        Parser<ObjectNode> parser = parsing.obj("root")
            .attribute("flow")
            .attribute("handler",  "handler", parsing.obj()
                .attribute("price", "price", parsing.number())
                .attribute("item")
                .attribute("value", "VALUE", parsing.with(Integer::parseInt))
            )
            .build();

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

将返回此Json

{
    "handler":{
        "item":"rice",
        "price":10.0,
        "value":3434
    },
    "flow":""
}

答案 2 :(得分:0)

我第二次提出康斯坦丁在XML和JSON之间使用POJO的建议 - 否则你会因为两者之间的不匹配而遇到无穷无尽的问题。具体来说,XML具有表示数组/列表的“本机”方式,因此处理空元素和单元素列表/数组通常会产生奇怪的结果。

我的建议是使用Jackson表示JSON,使用JAXBJackson XML-data-binding表示XML - 这样你也可以使用JAXB注释获取额外信息,如果必须命名的话改变了。

无论你使用什么,转储org.json包;如今的替代品更好,因此包装主要用作历史遗迹(当替代品不在时,它很有用。)