gpt4 book ai didi

java - JAXB 编码 Set
转载 作者:搜寻专家 更新时间:2023-11-01 00:52:46 25 4
gpt4 key购买 nike

我有一个类似这样的对象:

public class Obj {
@XmlElement(name="value")
public Set<Object> values;
}

编码时,生成的 xml 如下:

<Obj>
<value xsi:type="xs:dateTime" xmlns:xs="http://www.w3.org/2001/XMLSchema">2009-02-14T00:31:30.001+01:00</value>
<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">test</value>
</Obj>

但是,我想更改其中一些值(例如用于序列化 DateTimestamp 对象的日期格式),并摆脱烦人的 xsi属性(但这不是真正的要求,我可以接受)

我试过添加 @XmlJavaTypeAdaptervalues , 但在适配器中我得到了完整的 Set<Object>适应,而不是单一的元素。我也尝试过使用包适配器,但是,作为我的 Set用于 Object , 我不能把 @XmlJavaTypeAdapter(type)属性。

另外,我试过 @XmlJavaTypeAdapter(value=MyAdapter.class, type=Timestamp.class)只为我想要的对象中的值获取一个适配器。

所以问题是,有人知道让适配器为此工作的方法吗?或者,每次 Date 时更改日期格式或 Timestamp对象被序列化了吗?

提前致谢!

最佳答案

@XmlJavaTypeAdapter具有 type 属性的必须在包级别指定。当以这种方式使用时,它表示指定包中该类型的所有用法都使用 XmlAdapter 转换。 .例如。如果你有 package-info.java喜欢

@XmlJavaTypeAdapters({
@XmlJavaTypeAdaptor(type=Timestamp.class, value=MyAdapter.class)
})
package org.example;

然后是该包中带有时间戳字段的类。

package org.example;
public class Obj {
public Timestamp aTimestamp;
}

指定的适配器将用于转换时间戳。我怀疑这对你的 Set<Object> 有用案例,但我自己还没有尝试过。

xsi:type 的原因属性是 JAX-B 喜欢生成它可以反序列化的 XML,因此它需要指示它是什么类型,或者它只能将所有内容解析为字符串。您可以使用 @XmlElementRef 删除此属性注释来创建模式替换组,但在这种情况下,将使用不同的元素名称生成 XML。例如

public class Obj {
@XmlElementRefs({
@XmlElementRef(type=String.class, name="string"),
@XmlElementRef(type=Timestamp.class, name="timestamp")
})
public Set<Object> value;
}

如果集合中有时间戳和字符串,将生成以下 XML 结构。在这种情况下 xsi:type属性是不必要的,因为 JAX-B 可以根据元素名称判断要创建的类型。

<Obj>
<timestamp>2009-02-14T00:31:30.001+01:00</timestamp>
<string>test</string>
</Obj>

我强烈建议使用 @XmlElementWrapper如果您要采用这种方法,则注释来包装所有设置的项目。

如果您所追求的只是一组简单的字符串,您不关心将其反序列化回具有正确类型的 Java(或任何其他)对象,那么最简单的解决方案是拥有一个只适配的 XmlAdapter完整 Set<Object>进入 Set<String>并自行处理转换。

关于java - JAXB 编码 Set<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308266/

25 4 0