使用jackson将xml转换为json

使用jackson将xml转换为json,xml,json,jackson,Xml,Json,Jackson,我想将xml转换为json xml的格式如下所示- <default> <column> <title>Title 1</title> <id>id1</id> <value>val1</value> </column> <column> <title>Tit

我想将xml转换为json

xml的格式如下所示-

 <default> 
      <column>                      
        <title>Title 1</title>
    <id>id1</id>
    <value>val1</value>
  </column>
  <column>
    <title>Title 2</title>
    <id>id2</id>
    <value>val2</value>
  </column>
  <column>
    <title>Title 3</title>
    <id>id3</id>
    <value>val3</value>
  </column>
  </default>
但是当我使用jackson来实现这个目的时,它给了我以下的json-

{
    "column": {
        "title": "Title 3",
        "id": "id3",
        "value": "val3"
    }
}
我试过使用jackson 1.9和jackson 2.1,但它没有给我预期的输出

有人能告诉我是否有可能或者我需要更改我的xml格式吗? 下面是我为实现上述场景而编写的代码-

    try {
            XmlMapper xmlMapper = new XmlMapper();
            Map entries = xmlMapper.readValue(new File("xmlPath"), Map.class);

            ObjectMapper jsonMapper = new ObjectMapper();
            String json = jsonMapper.writeValueAsString(entries);
            System.out.println(json);

        } catch (Exception e) {
            e.printStackTrace();
        }       

谢谢

在一个小组项目中,我遇到了与您描述的相同的问题。我们使用的解决方案是将Maven依赖项从Jackson更改为json库。我们将此网站用作指南:


net.sf.json-lib
json库
2.4
罐子
jdk15
编译

--$pli7

我使用Jackson 2.5也遇到了这个问题。我的解决方案是将使用中的
javax.json.JsonObjectBuilder
的实现替换为我自己的,当添加新对象时,其行为如下:

public class CustomJsonObjectBuilder implements JsonObjectBuilder {

  private final Map<String, JsonValue> jsonFragments;

  // other methods omitted for brevity

   public JsonObjectBuilder add(String name, JsonValue value) {
     if(jsonFragments.containsKey(name)) {
        JsonValue oldValue = jsonFragments.get(name);
        JsonArrayBuilder newBuilder = new JsonArrayBuilderImpl();
        if(oldValue instanceof JsonArray) {
            JsonArray theArray = (JsonArray) oldValue;
            for (JsonObject oldValues : theArray.getValuesAs(JsonObject.class)) {
                newBuilder.add(oldValues);
            }
        } else {
            newBuilder.add(oldValue);
        }
        newBuilder.add(value);
        jsonFragments.put(name, newBuilder.build());
     } else {
        jsonFragments.put(name, value);
     }
     return this;
   }
公共类CustomJsonObjectBuilder实现JsonObjectBuilder{
私有最终映射jsonFragments;
//为简洁起见,省略了其他方法
公共JsonObjectBuilder添加(字符串名称、JsonValue){
if(jsonFragments.containsKey(名称)){
JsonValue oldValue=jsonFragments.get(名称);
JsonArrayBuilder newBuilder=new JsonArrayBuilderImpl();
if(JsonArray的oldValue实例){
JsonArray theArray=(JsonArray)oldValue;
for(JsonObject旧值:theArray.getValuesAs(JsonObject.class)){
newBuilder.add(旧值);
}
}否则{
newBuilder.add(旧值);
}
新造船商。增加(价值);
jsonFragments.put(名称,newBuilder.build());
}否则{
jsonFragments.put(名称、值);
}
归还这个;
}

我能够通过使用API将源XML转换为JSON,然后通过Jackson API将其转换为JSON,从而获得这个问题的解决方案

代码

导入java.io.File;
导入java.io.FileInputStream;
导入java.io.InputStream;
导入org.apache.commons.io.IOUtils;
导入org.json.JSONObject;
导入org.json.XML;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.SerializationFeature;
...
...
try(InputStream InputStream=新文件InputStream(新文件(
“source.xml”))){
字符串xml=IOUtils.toString(inputStream);
JSONObject jObject=XML.toJSONObject(XML);
ObjectMapper mapper=新的ObjectMapper();
enable(SerializationFeature.INDENT_输出);
Object json=mapper.readValue(jObject.toString(),Object.class);
字符串输出=mapper.writeValueAsString(json);
系统输出打印项次(输出);
}
...
...

看起来只有最后一个元素正在被转换。您应该在问题中添加一个,说明您是如何执行此转换的。您到底在做什么?您的描述只涉及预期的输入和输出,而不是您(尝试)获取该输入和输出的操作。链接已断开。
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <type>jar</type>
    <classifier>jdk15</classifier>
    <scope>compile</scope>
</dependency>
public class CustomJsonObjectBuilder implements JsonObjectBuilder {

  private final Map<String, JsonValue> jsonFragments;

  // other methods omitted for brevity

   public JsonObjectBuilder add(String name, JsonValue value) {
     if(jsonFragments.containsKey(name)) {
        JsonValue oldValue = jsonFragments.get(name);
        JsonArrayBuilder newBuilder = new JsonArrayBuilderImpl();
        if(oldValue instanceof JsonArray) {
            JsonArray theArray = (JsonArray) oldValue;
            for (JsonObject oldValues : theArray.getValuesAs(JsonObject.class)) {
                newBuilder.add(oldValues);
            }
        } else {
            newBuilder.add(oldValue);
        }
        newBuilder.add(value);
        jsonFragments.put(name, newBuilder.build());
     } else {
        jsonFragments.put(name, value);
     }
     return this;
   }