Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅使用Jackson将XML转换为JSON?_Java_Json_Xml_Jackson - Fatal编程技术网

Java 如何仅使用Jackson将XML转换为JSON?

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不

我从服务器得到一个XML响应。但我需要以JSON格式显示它

有没有办法在没有第三方API的情况下进行转换?我使用了Jackson,但为此我需要创建POJO

来自服务器的响应如下所示:


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
的问题是,当同一级别上有多个同名元素时,它将用新元素替换上一个元素,并最终导致数据丢失。通常,我们必须将其添加到数组中。要解决此问题,我们可以覆盖
\u
jsonNodeSerializer
类的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);