java-将自由格式的XML / JSON映射到Moxy / JAXB注释的类
作者:互联网
我正在尝试找到一种将以下XML / JSON文档正确映射到等效的JAXB / Moxy注释类的方法.
请注意,在我的示例中描述的人的文档的模型元素是自由格式的,即可以是任何类型的XML元素/ JSON对象,这不是静态已知的.
XML文件:
<form>
<title>Person Form</title>
<model>
<person>
<name>John</name>
<surname>Smith</surname>
<address>
<street>Main St.</street>
<city>NY</city>
<country>USA</country>
</address>
<person>
</model>
</form>
等效的JSON文档:
{
"title":"Form Title",
"model":{
"person":{
"name":"John",
"surname":"Smith",
"address":{
"street":"Main St.",
"city":"NY",
"country":"USA"
}
}
}
}
我想将模型字段映射为Map,其中值可能是原始类型或Map本身.
这种映射足以满足我的需求.
我尝试使用@ XmlReadTransformer,@ XmlWriteTransformer MOXY批注,但未成功(在buildAttributeValue中获得的记录参数始终为null)
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD)
public class Form {
private String title;
private Model model;
....getters and setters....
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Model {
@XmlElement
@XmlReadTransformer(transformerClass = Transformer.class)
@XmlWriteTransformers({ @XmlWriteTransformer(xmlPath = "./*", transformerClass = Transformer.class) })
private Map<String, Object> data;
public Map<String, Object> getData() {
return data;
}
public void setData(Map<String, Object> data) {
this.data = data;
}
public static class Transformer implements AttributeTransformer, FieldTransformer {
private AbstractTransformationMapping tm;
public Transformer() {
}
@Override
public void initialize(AbstractTransformationMapping tm) {
this.tm = tm;
}
@Override
public Map<String, Object> buildAttributeValue(Record r, Object o,
Session s) {
Map<String, Object> data = new HashMap<String, Object>();
// TODO: ????
return data;
}
@Override
public Object buildFieldValue(Object arg0, String arg1, Session arg2) {
// TODO
return null;
}
}
}
您能建议我解决问题的正确方法还是对“模型”字段进行建模的另一种方法?
解决方法:
Person(或您拥有的其他任何类)是否是在运行时可用的类?是否可以对XML / JSON稍加修改以使其包含类型属性,以指示其对应的类?如果是这样的话,这里的例子可以帮助你http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html
然后您的模型将具有以下内容
@XmlAnyElement
private List<Parameter> data;
并在链接的示例中使用ParameterAdapter,则需要包括它在XML和JSON中使用的type属性
{
"title" : "Form Title",
"model" : {
"person" : {
"type" : "test.Person",
"name" : "John",
"surname" : "Smith",
...
}
要么
<form>
<title>Person Form</title>
<model>
<person type="test.Person">
<name>John</name>
<surname>Smith</surname>
...
</form>
标签:jaxb,moxy,freeform,java 来源: https://codeday.me/bug/20191030/1971782.html