Я использую java 8 и (quickjackson) Jackson 2.8.1.Преобразование XML в Json с использованием Jackson, @JsonUnwrapped производящие нули
У меня есть xml, который мне нужно преобразовать в json, используя Java. Структура 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>
Я выбрал Джексон для десериализации из XML в Java, а затем сериализации из Java в JSON. Мишень JSON должен разворачивать «LINEITEM» и «lineItemType», чтобы получить JSON похож на это:
{
"input" : {
"order" : {
"lineItemList" : [ {
"upc" : 123,
"quantity" : 1,
"retailPrice" : 14,
"orderID" : 234,
"shipmentID" : 1,
"lineID" : 1
} ]
}
}
}
В моей Java модели, есть 3 соответствующие классы в игре здесь: Заказ, LineItem и LineItemType. В классе порядка, я аннотированный так:
@JacksonXmlProperty(localName="lineItemList")
@JsonProperty("lineItemList")
List<LineItem> lineItems;
В LineItem, например, так:
@JacksonXmlProperty(localName="lineItemType")
@JsonUnwrapped
LineItemType lineItemType;
и LineItemType он просто имеет свойства в этой схеме:
...
@JacksonXmlProperty(localName="orderID")
@JsonProperty("orderID")
String orderId;
@JacksonXmlProperty(localName="lineID")
@JsonProperty("lineID")
String lineId;
...
Как вы можете видеть, я попытался решить эту проблему, используя @JsonUnwrapped из класса LineItem, но конечный эффект заключается в том, что XMLDeserializer заканчивает чтение этой аннотации и производит «нулевые» значения как таковые:
{
"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
} ]
}
}
}
}
Кто-нибудь знает, как это должно быть аннотированный, чтобы получить желаемый результат здесь (развернутый, но с значения)? Благодаря!
Пробовал это, это не решило проблему. Я все еще получаю нулевые значения при использовании @JsonUnwrapped и нежелательного слоя в моем json, когда я этого не делаю. Спасибо за предложение! –
Ваш пример JSON недействителен и не соответствует спецификации. Если вы отредактируете его так, как хотите, тогда я посмотрю, смогу ли я помочь вам дальше. Это JSON, что мой примеры кода вывода (проверено): { \t "вход": { \t \t "заказ": { \t \t \t "lineItemList": [{ \t \t \t \t «UPC «: 123, \t \t \t \t "количество": 1, \t \t \t \t "retailPrice": 14, \t \t \t \t "идентификатор заказа": 234, \t \t \t \t "shipmentID": 1, \t \t \t \t "lineID": 1 \t \t \t}] \t \t} \t} } –
Разница между ваш пример и мой - это то, что вы начали с java и преобразовали в json, и я начал с xml, преобразованный в java, а затем используя ту же модель, преобразованную в json. Проблема была там. XMLMapper из Jackson фактически читал и использовал @JsonUnwrapped во время десериализации, которая была неожиданна мной, и в конечном счете то, что вызывало ошибку ... –