簡體   English   中英

帶條件的 XML 到 JSON 轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM