[英]XML to JSON Conversion with Conditions
想將 xml 字符串轉換為 Json,我正在按如下方式進行。
必須轉換的 XML
<Item>
<Property name="Description" value="Description 1"/>
<Property name="EffDate" value="01/05/2017"/>
<Property name="ExpDate" value="12/31/9999"/>
<Property name="Status" value="Launched"/>
</Item>
我為 xml 創建了一個類,如下所示。
public class Context {
@XmlElement(name = "Item")
private List<Item> offer;
}
public class Item {
@XmlElement(name = "Property")
private List<Property> properties;
}
public class Property {
@XmlAttribute
private String name;
@XmlAttribute
private String value;
}
我正在使用 Gson 庫將此 Java 對象轉換為 Json - g.toJson。
轉換后的 JSON -
"offer": [{
"properties": [{
"name": "Description",
"value": "Description 1"
},
{
"name": "EffDate",
"value": "01/05/2017"
},
{
"name": "ExpDate",
"value": "12/31/9999"
},
{
"name": "Status",
"value": "Launched"
}]
}]
但我們想如下轉換 JSON -
"offer": [{
"Description" : "Description 1",
"EffDate":"01/05/2017",
"ExpDate": "12/31/9999",
"Status": "Launched"
}]
有沒有辦法將屬性名稱和值轉換為 Item 類屬性。?
嘗試使用此鏈接: https : //github.com/stleary/JSON-java這是一個可以將 XML 轉換為 JSON 的 JSON Helper 類,例如:
public class Main {
public static int PRETTY_PRINT_INDENT_FACTOR = 4;
public static String TEST_XML_STRING =
"<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";
public static void main(String[] args) {
try {
JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
System.out.println(jsonPrettyPrintString);
} catch (JSONException je) {
System.out.println(je.toString());
}
}
}
希望這可以幫助 :)
可以使用FasterXML庫。 您可以在其中編寫用於生成 XML 和 JSON 的自定義邏輯。 通過覆蓋JsonSerializer
類的serialize
。
需要編寫序列化程序,如:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class ContextSerializer extends JsonSerializer<Context> {
@Override
public void serialize(Context t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException {
jg.writeStartObject();
jg.writeArrayFieldStart("offer");
for (Item i : t.offer) {
jg.writeStartObject();
for (Property property : i.properties) {
jg.writeStringField(property.name, property.value);
}
jg.writeEndObject();
}
jg.writeEndArray();
jg.writeEndObject();
}
}
對於轉換:
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBException;
public class Main {
public static void main(String[] args) throws JAXBException, JsonProcessingException {
Context c = new Context();
List<Item> offer = new ArrayList<>();
Item pr = new Item();
pr.properties = new ArrayList<>();
Property p = new Property();
p.name = "asdf";
p.value = "va1";
pr.properties.add(p);
p = new Property();
p.name = "asdf1";
p.value = "va11";
pr.properties.add(p);
offer.add(pr);
c.offer = offer;
try {
SimpleModule module = new SimpleModule();
module.addSerializer(Context.class, new ContextSerializer());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
objectMapper.setSerializationInclusion(Include.NON_DEFAULT);
String json = objectMapper.writeValueAsString(c);
System.out.println(json);
} catch (Exception e) {
System.out.println(""+e);
}
}
}
O/P JSON :(如果您將名稱提供給列表(“offer”),則您的問題中提供的 O/P JSON 是錯誤的,那么它始終位於對象鏈接內)
{
"offer": [{
"asdf": "va1",
"asdf1": "va11"
}
]
}
包的 Maven 依賴項是:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0.pr3</version>
</dependency>
如果您使用的是Java 8或更高版本,您應該查看我的開源庫: unXml 。 unXml 基本上從 Xpaths 映射到 Json 屬性。
它在Maven Central上可用。
例子
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;
public class Parser {
public ObjectNode parseXml(String xml){
Parsing parsing = ParsingFactory.getInstance().create();
Document document = parsing.xml().document(xml);
Parser<ObjectNode> parser = parsing.obj("/")
.attribute("offer", parsing.arr("/Item")
.attribute("Description", "Property[@name='Description']/@value")
.attribute("EffDate", "Property[@name='EffDate']/@value")
.attribute("ExpDate", "Property[@name='ExpDate']/@value")
.attribute("Status", "Property[@name='Status']/@value")
)
.build();
ObjectNode result = parser.apply(document);
return result;
}
}
它將返回一個Jackson ObjectNode
,帶有以下 json:
{
"offer": [
{
"Status": "Launched",
"Description": "Description 1",
"ExpDate": "12/31/9999",
"EffDate": "01/05/2017"
}
]
}
您可以將 xml 轉換為地圖,對其進行修改,然后再轉換為 json。 U.fromXml(xml)
-java庫有靜態方法U.fromXml(xml)
和U.toJson(json)
。 我是項目的維護者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.