编程语言
首页 > 编程语言> > java-将自由格式的XML / JSON映射到Moxy / JAXB注释的类

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