Примечание. Я EclipseLink JAXB (MOXy)< /strong> руководитель и участник JAXB (JSR- 222) группа экспертов.
MOXy не имеет прямого эквивалента @JsonAnySetter
Джексона. Я ввел следующий запрос на улучшение, чтобы добавить этот тип поведения:
Ниже приведена некоторая информация о некоторых расширениях MOXy, которые могут быть применимы к вашему варианту использования.
MOXy's @XmlVirtualAccessMethods
Если свойства JSON на самом деле не неизвестны, они просто не существуют как свойства в вашей модели домена, тогда вы можете использовать расширение MOXy @XmlVirtualAccessMethods
(см.: http://blog.bdoughan.com/2011/06)./extensible-models-with-eclipselink-jaxb.html) .
Модель Java
Клиент
Аннотация методов @XmlVirtualAccess
используется для указания того, что класс Customer
является расширяемым.
import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods;
@XmlVirtualAccessMethods(setMethod = "put")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
private String firstName;
private Address billingAddress;
@XmlTransient
private Map<String, Object> extensions = new HashMap<String, Object>();
public <T> T get(String property) {
return (T) extensions.get(property);
}
public void put(String property, Object value) {
extensions.put(property, value);
}
}
Адрес
package forum18068176;
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
Документ сопоставления (oxm.xml)
Определения свойств расширения определены в документе сопоставления MOXy (см.: http://blog.bdoughan.com/2011/04/moxys-xml-metadata-in-jax-rs-service.html).
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum18068176">
<java-types>
<java-type name="Customer">
<xml-type prop-order="firstName lastName billingAddress shippingAddress"/>
<java-attributes>
<xml-element
java-attribute="lastName"
type="java.lang.String"/>
<xml-element
java-attribute="shippingAddress"
type="forum18068176.Address"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Демо
Ниже приведен отдельный демонстрационный код, который вы можете запустить, чтобы увидеть, как все работает. Вам нужно будет указать MOXy в качестве поставщика JAXB (см.: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html).
package forum18068176;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum18068176/oxm.xml");
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Customer.class}, properties);
// Unmarshal JSON
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource("src/forum18068176/input.json");
Customer customer = unmarshaller.unmarshal(json, Customer.class).getValue();
// Access Extension Properties
String lastName = customer.<String>get("lastName");
Address shippingAddress = customer.<Address>get("shippingAddress");
// Marshal Objects
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
ввод.json/вывод
{
"firstName" : "Jane",
"lastName" : "Doe",
"billingAddress" : {
"street" : "1 A Street"
},
"shippingAddress" : {
"street" : "2 B Road"
}
}
Расширение MOXy @XmlVariableNode с XmlAdapter
Если все неизвестные элементы относятся к одному типу, вы можете использовать комбинацию @XmlVariableNode
MOXy (см.: http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-json-schema.html) и XmlAdapter
, чтобы получить желаемый результат:
person
bdoughan
schedule
06.08.2013