gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:17 24 4
gpt4 key购买 nike

我正在尝试找到一种方法来将以下 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com