java - 将自由格式的 XML/JSON 映射到 Moxy/JAXB 注释类

标签 java jaxb moxy freeform

我正在尝试找到一种方法来将以下 XML/JSON 文档正确地映射到等效的 JAXB/Moxy 注释类
请注意,文档的 model 元素(在我的示例中描述了一个人)是自由形式,即可能是任何类型的 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"  
         }          
      }  
   }
}

我想将 model 字段映射为 Map,其中 values 可能是原始类型映射自己。 此映射足以满足我的需求。

我尝试使用@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 中使用的类型属性

{
   "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>

关于java - 将自由格式的 XML/JSON 映射到 Moxy/JAXB 注释类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16336002/

相关文章:

java - 如何在 JavaFX 中实现派生只读属性/值?

java - JAXB - 将 Java 接口(interface)映射到 Web 服务上下文中的第 3 方库实现

java - 序列化 Java 对象

java - Jackson 中的 @XmlPath 模拟是什么?

java - JAXB 2.x 和 Ant

java - ProgressDialog 未启动 - Android (java)

Java 函数中相对于 header 方法的不同返回类型

java - 使用 Apache POI 保留 Excel 标题中的图像

java - 无法转换为类型 spring.oxm.marshaller : no matching editors or conversion strategy found

java - 如何将大写字母的 Sharepoint JSON 对象映射到 MOXy 类?