Java 如何仅使用Jackson将XML转换为JSON?
我从服务器得到一个XML响应。但我需要以JSON格式显示它 有没有办法在没有第三方API的情况下进行转换?我使用了Jackson,但为此我需要创建POJO 来自服务器的响应如下所示:Java 如何仅使用Jackson将XML转换为JSON?,java,json,xml,jackson,Java,Json,Xml,Jackson,我从服务器得到一个XML响应。但我需要以JSON格式显示它 有没有办法在没有第三方API的情况下进行转换?我使用了Jackson,但为此我需要创建POJO 来自服务器的响应如下所示: 400字段“数量”无效。指定的数量大于可装运产品的数量。012525 有没有什么方法可以在不使用任何第三方API的情况下将xml转换为json 如果你是务实的,没有 解析XML的步骤可以使用作为JavaSE一部分的API来执行。但是,从解析的XML(例如DOM)到JSON需要一个JSON支持库,而JavaSE不
400字段“数量”无效。指定的数量大于可装运产品的数量。012525
有没有什么方法可以在不使用任何第三方API的情况下将xml转换为json
如果你是务实的,没有
解析XML的步骤可以使用作为JavaSE一部分的API来执行。但是,从解析的XML(例如DOM)到JSON需要一个JSON支持库,而JavaSE不包括一个
(理论上,你可以自己编写这样一个库,但这样做有什么意义?)
我使用了Jackson,但为此我需要创建POJO @凯西奥指出,杰克逊允许你在不写POJO的情况下进行翻译。或者,看看其他(第三方)用于Java的JSON API;有关备选方案的列表,请参阅。一些简单的方法不涉及使用Jackson 2.x定义POJO 您可以通过Jackson实现这一点,而无需POJO:
String xml=“\n”+
“\n”+
“\n”+
“400\n”+
“字段“数量”无效。\n”+
“\n”+
“指定的数量大于可装运的产品数量。\n”+
“:
仅以有限的方式支持树模型:具体而言,Java数组和集合可以编写,但不能读取,因为在没有附加信息的情况下无法区分数组和对象
使用JSON.org
您也可以通过JSON.org来实现:
String xml=“\n”+
“\n”+
“\n”+
“400\n”+
“字段“数量”无效。\n”+
“\n”+
“指定的数量大于可装运的产品数量。\n”+
“0\n”+
“12525\n”+
“\n”+
“\n”+
"";
字符串json=XML.toJSONObject(XML.toString();
需要以下依赖项:
org.json
json
20160810
我知道我现在回答这个问题已经太迟了。但我写这篇文章是为了那些偶然发现这个问题并考虑使用@Cassio的答案的新手们
使用XmlMpper
反序列化到JsonNode
的问题是,当同一级别上有多个同名元素时,它将用新元素替换上一个元素,并最终导致数据丢失。通常,我们必须将其添加到数组中。要解决此问题,我们可以覆盖\ujsonNodeSerializer
类的UpplicateField()
方法。说够了。让我们看看代码
public class DuplicateToArrayJsonNodeDeserializer extends JsonNodeDeserializer {
@Override
protected void _handleDuplicateField(JsonParser p, DeserializationContext ctxt,
JsonNodeFactory nodeFactory,String fieldName, ObjectNode objectNode,
JsonNode oldValue, JsonNode newValue) throws JsonProcessingException {
ArrayNode node;
if(oldValue instanceof ArrayNode){
node = (ArrayNode) oldValue;
node.add(newValue);
} else {
node = nodeFactory.arrayNode();
node.add(oldValue);
node.add(newValue);
}
objectNode.set(fieldName, node);
}
}
因为我们已经覆盖了默认的反序列化程序,所以我们还需要在XmlMapper
中注册它才能使其工作
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(new SimpleModule().addDeserializer(
JsonNode.class,
new DuplicateToArrayJsonNodeDeserializer()
));
JsonNode node = xmlMapper.readTree(payLoad);
使用杰克逊
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
public class JsonUtil {
private static XmlMapper XML_MAPPER = new XmlMapper();
private static ObjectMapper JSON_MAPPER = new ObjectMapper();
public static ObjectMapper getJsonMapper(){
return JSON_MAPPER;
}
public static XmlMapper getXmlMapper(){
return XML_MAPPER;
}
public static String xmlToJson(String xml){
try {
return getJsonMapper().writeValueAsString(getXmlMapper().readTree(xml));
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
}
我刚刚遵循了cassiomolin的步骤。在使用jackson 2.x库时,我遇到了以下异常
Cannot create XMLStreamReader or XMLEventReader from a org.codehaus.stax2.io.Stax2ByteArraySource
如果您还面临上述异常,请添加以下代码以解决此问题。这样您就可以在不使用命名空间的情况下查看转换后的JSON
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);
提示:
如果您想转换不带名称空间的XML,请使用jackson library。不要使用org.json libs。它不支持此用例。该服务器是否也支持application/json
?顺便说一句,jackson也有一个XML转换器是的..当我这样发布时:setEntity(新的StringEntity(aobj,ContentType.create(“application/json”));response=httpclient.execute(target,httpPost);我得到了xml格式表单服务器的成功或失败响应。@cricket_007但我不想为此创建pojo类。成功时,它向我发送了成功消息,失败时,它向我发送了错误消息。我不确定这个问题是否真的偏离主题。OP没有要求我们推荐或查找一本书、工具、软件库、教程或其他非现场资源。他们询问是否有任何方法可以在没有任何第三方API的情况下将XML转换为JSON。谢谢@cassio。但是我们使用的是jackson1.7,我看不到这个jar中有XMLMapper。我是否也需要额外的jar来安装XMLMappper。@samunp我不确定您是否能够使用它h Jackson 1.x。我用另一个选项更新了我的答案。但是它需要一个外部依赖项。@samunp刚刚告诉您,Jackson 2.x的XML支持是作为一个单独的工件发布的。换句话说,即使在使用Jackson 2.x时,如果您想使用Jackson dataformat XML
依赖项,也需要包含Jackson dataformat XML
依赖项>XmlMapper
。这是我在这个网站上看到的关于MIME转换的唯一一个非常一致的答案。谢谢。Jackson选项的最大警告是XML经常有重复的键,当Jackson将具有重复键的XML转换为JSON时,它们将被覆盖。回答太棒了!
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);