我使用org.json api
将xml转换为json。问题是我的xml中的某些标记包含非字符串值(即int,boolean,double等...)。
我在下面使用的代码成功地将xml转换为json,但原始数据类型在json响应中转换为字符串。例如:xml中的<age>10<age>
转换为{"age" : "10" }
,其中json中的值10
为String
,应为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
}
}
答案 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,使用JAXB或Jackson XML-data-binding表示XML - 这样你也可以使用JAXB注释获取额外信息,如果必须命名的话改变了。
无论你使用什么,转储org.json包;如今的替代品更好,因此包装主要用作历史遗迹(当替代品不在时,它很有用。)