使用jackson将xml转换为json
我想将xml转换为json xml的格式如下所示-使用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
<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;
}