当前位置: 首页 > 知识库问答 >
问题:

使用Jackson进行XML到Json的转换,@JSONUnwrapped生成null

秦斌
2023-03-14

我使用的是Java8和(fasterjackson)Jackson 2.8.1。

我有一个xml,我需要用Java转换成json。xml结构如下所示:

<Input>
    <ns0:order>
        <ns0:lineItemList>
            <ns0:lineItem>
                <ns0:lineItemType>
                    <ns0:orderID>234</ns0:orderID>
                    <ns0:shipmentID>1</ns0:shipmentID>
                    <ns0:lineID>1</ns0:lineID>
                    <ns0:upc>123</ns0:upc>
                    <ns0:quantity>1</ns0:quantity>
                    <ns0:retailPrice>14</ns0:retailPrice>
                </ns0:lineItemType>
            </ns0:lineItem>
        </ns0:lineItemList>
    </ns0:order>
</Input>

我选择Jackson从xml反序列化到java,然后从java序列化到JSON。目标json需要解压缩“LineItem”和“LineItemType”以获得类似于以下内容的json:

{  
  "input" : {
    "order" : {  
     "lineItemList" : [ {
        "upc" : 123,
        "quantity" : 1,
        "retailPrice" : 14,
        "orderID" : 234,
        "shipmentID" : 1,
        "lineID" : 1
      } ]
    }
  }
}
@JacksonXmlProperty(localName="lineItemList")
@JsonProperty("lineItemList")
List<LineItem> lineItems;
@JacksonXmlProperty(localName="lineItemType")
@JsonUnwrapped
LineItemType lineItemType;
...
@JacksonXmlProperty(localName="orderID")
@JsonProperty("orderID")
String orderId;

@JacksonXmlProperty(localName="lineID")
@JsonProperty("lineID")
String lineId;

...
{  
  "input" : {
    "order" : {  
     "lineItemList" : [ {
        "upc" : null,
        "quantity" : null,
        "retailPrice" : null,
        "orderID" : null,
        "shipmentID" : null,
        "lineID" : null
      } ]
    }
  }
}

如果省略@jsonunwrapped,则会出现值,但嵌套如下:

{  
  "input" : {
    "order" : {  
     "lineItemList" : [ {
      "lineItemType" : {
        "upc" : 123,
        "quantity" : 1,
        "retailPrice" : 14,
        "orderID" : 234,
        "shipmentID" : 1,
        "lineID" : 1
       } ]
      }
    }
  }
}

有没有人知道应该如何对此进行注解以获得这里想要的结果(打开包装但带有值)?谢了!

共有1个答案

左丘楷
2023-03-14

您是否已经成功地从XML封送到POJO中?在XML示例中,first order标记是自关闭的,这可能会导致问题。

这就是我将如何布局每个POJO(同时添加XmlProperties)。这应该正确地从POJO解封到JSON中。

顶层(example.java):

package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({
    "input"
})
public class Example {

    @JsonProperty("input")
    private Input input;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * 
     * @return
     *     The input
     */
    @JsonProperty("input")
    public Input getInput() {
        return input;
    }

    /**
     * 
     * @param input
     *     The input
     */
    @JsonProperty("input")
    public void setInput(Input input) {
        this.input = input;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({
    "order"
})
public class Input {

    @JsonProperty("order")
    private Order order;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * 
     * @return
     *     The order
     */
    @JsonProperty("order")
    public Order getOrder() {
        return order;
    }

    /**
     * 
     * @param order
     *     The order
     */
    @JsonProperty("order")
    public void setOrder(Order order) {
        this.order = order;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
package com.example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({
    "lineItemList"
})
public class Order {

    @JsonProperty("lineItemList")
    private List<LineItemList> lineItemList = new ArrayList<LineItemList>();
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * 
     * @return
     *     The lineItemList
     */
    @JsonProperty("lineItemList")
    public List<LineItemList> getLineItemList() {
        return lineItemList;
    }

    /**
     * 
     * @param lineItemList
     *     The lineItemList
     */
    @JsonProperty("lineItemList")
    public void setLineItemList(List<LineItemList> lineItemList) {
        this.lineItemList = lineItemList;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonPropertyOrder({
    "upc",
    "quantity",
    "retailPrice",
    "orderID",
    "shipmentID",
    "lineID"
})
public class LineItemList {

    @JsonProperty("upc")
    private Integer upc;
    @JsonProperty("quantity")
    private Integer quantity;
    @JsonProperty("retailPrice")
    private Integer retailPrice;
    @JsonProperty("orderID")
    private Integer orderID;
    @JsonProperty("shipmentID")
    private Integer shipmentID;
    @JsonProperty("lineID")
    private Integer lineID;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * 
     * @return
     *     The upc
     */
    @JsonProperty("upc")
    public Integer getUpc() {
        return upc;
    }

    /**
     * 
     * @param upc
     *     The upc
     */
    @JsonProperty("upc")
    public void setUpc(Integer upc) {
        this.upc = upc;
    }

    /**
     * 
     * @return
     *     The quantity
     */
    @JsonProperty("quantity")
    public Integer getQuantity() {
        return quantity;
    }

    /**
     * 
     * @param quantity
     *     The quantity
     */
    @JsonProperty("quantity")
    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    /**
     * 
     * @return
     *     The retailPrice
     */
    @JsonProperty("retailPrice")
    public Integer getRetailPrice() {
        return retailPrice;
    }

    /**
     * 
     * @param retailPrice
     *     The retailPrice
     */
    @JsonProperty("retailPrice")
    public void setRetailPrice(Integer retailPrice) {
        this.retailPrice = retailPrice;
    }

    /**
     * 
     * @return
     *     The orderID
     */
    @JsonProperty("orderID")
    public Integer getOrderID() {
        return orderID;
    }

    /**
     * 
     * @param orderID
     *     The orderID
     */
    @JsonProperty("orderID")
    public void setOrderID(Integer orderID) {
        this.orderID = orderID;
    }

    /**
     * 
     * @return
     *     The shipmentID
     */
    @JsonProperty("shipmentID")
    public Integer getShipmentID() {
        return shipmentID;
    }

    /**
     * 
     * @param shipmentID
     *     The shipmentID
     */
    @JsonProperty("shipmentID")
    public void setShipmentID(Integer shipmentID) {
        this.shipmentID = shipmentID;
    }

    /**
     * 
     * @return
     *     The lineID
     */
    @JsonProperty("lineID")
    public Integer getLineID() {
        return lineID;
    }

    /**
     * 
     * @param lineID
     *     The lineID
     */
    @JsonProperty("lineID")
    public void setLineID(Integer lineID) {
        this.lineID = lineID;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
{
    "input": {
        "order": {
            "lineItemList": [{
                "upc": 123,
                "quantity": 1,
                "retailPrice": 14,
                "orderID": 234,
                "shipmentID": 1,
                "lineID": 1
            }]
        }
    }
}
 类似资料:
  • 下面有一个实体类,有两个字符串字段:name和description。description字段将包含一个原始JSON值,例如{“abc”:123} 如果存在@JSONRAWValue注释,建议如何将创建的JSON字符串编组回to Entity对象?我是不是遗漏了另一个注释? 谢谢

  • 我想将XMl转换为另一种XMl格式。假设我在ats中有一个逻辑。埃姆沃。使改变TransformXml java文件如何集成以在camel上下文输入中转换tis(file:///d:/in)是xml文件,我想将其另存为xml。我已经将此文件作为bean类添加到camel

  • 有没有办法把xml文件转换成json?XML可以是任何结构,因此没有用于实例化的POJO类。我需要将xml转换成json或Map,不需要根节点。 例如: 期望的JSON

  • 我正在尝试使用JOLT(使用NiFi JoltTransformJson处理器)将JSON转换为不同的格式。对于单个JSON记录,正在使用的JOLT在JOLT应用程序演示中运行良好,而如果我使用多个JSON记录执行,那么我在JOLT应用程序演示中没有得到预期的输出。有人能告诉我在JOLT规范中需要做哪些额外的更改来处理多个JSON记录吗? 示例输入json JOLT使用: 预期输出JSON:

  • 问题内容: 我将我的messageconverter配置为Jackson的 并在控制器中 从该即时消息期望从服务器返回JSON字符串{x:‘3’,y:‘4’},而无需任何其他配置。但是收到对我的ajax请求的404错误响应 如果使用@ResponseBody注释该方法,则将返回类型写入响应HTTP正文。该返回值将使用HttpMessageConverters转换为声明的方法参数类型。 我错了吗 ?

  • 不推荐使用,是否有其他解决此问题的方法?