MOXy традиционно представляет собой объект-преобразователь XML, однако его можно использовать и для генерации JSON через MoxyJsonProvider. MOXy также имеет инструмент для сопоставления с XML вне преобразования 1-1 через сопоставления XPath. Можете ли вы также использовать этот инструмент для изменения вывода JSON? Я сомневаюсь в этом, но сверстник спросил меня об этом.
Сейчас я достигаю этого с помощью FasterXML Jackson с помощью нескольких методов, таких как создание @JsonProperty
для определенного свойства, которое я хочу получить от другого объекта, или путем заполнения карты полями, которые я хочу создать вложенный объект JSON.
// XML Input
// I don't have this file. I'll try to generate it based on the code but the meat and bones of the question is in the transformation via
File xmlInput = new File(input.xml);
// Processs the XML
JAXBContext context = JAXBContext.newInstance("model");
Unmarshaller unmarshaller = context.createUnmarshaller();
CustomerImpl customerImpl =
(CustomerImpl) unmarshaller.unmarshal(xmlInput);
// Build the Customer Object
Customer customer = new Customer();
// Build the Address Object
ContactInfoImpl contactInfoImpl = customerImpl.getContactInfo();
if(null != contactInfoImpl) {
AddressImpl addressImpl = customerImpl.getAddress();
if(null != addressImpl) {
Address address = new Address();
customer.setAddress(address);
address.setStreet(addressImpl.getStreet());
}
}
Customer.java
@XmlRootElement
public class Customer {
@XmlPath("contact-info/address")
private Address address;
}
Это сгенерирует:
<customer>
<contact-info>
<address>
<street>123 Any Street</street>
</address>
</contact-info>
</customer>
Может ли это быть использовано для создания модифицированных отображений JSON? То есть я могу использовать это, чтобы свернуть вложенные объекты JSON в поля или обернуть поля во вложенные объекты JSON? Пример
{
"street" : "123 Any Street"
}
Изменено с помощью аннотации "XMLPath":
Customer.java
@XmlRootElement
public class Customer {
@XmlPath("address")
private String address;
}
{
"address" : {
"street" : "123 Any Street"
}
}