- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试使用相同的 JAXB 注释(使用 JaxbAnnotationModule )绑定(bind) XML 和 JSON。
XML <--> JAXB <--> Jackson <--> JSON
我必须使用 JAXB 注释并且不能更改它们。我的问题是一些 XML 转换为通用类 JAXBElement<T>
而不是类 T
直接地。这导致 JSON 输出:
{
"JAXBElement":{
"name":"{http://www.opengis.net/wps/1.0.0}Capabilities",
"declaredType":"net.opengis.wps.v_1_0_0.WPSCapabilitiesType",
"scope":"javax.xml.bind.JAXBElement$GlobalScope",
"value":{
"ProcessOfferings":{ },
"Languages":{ },
"ServiceIdentification":{ },
"ServiceProvider":{ },
"OperationsMetadata":{ },
"version":"1.0.0",
"updateSequence":"1",
"service":"WPS",
"lang":"en-US"
},
"nil":false,
"globalScope":true,
"typeSubstituted":false
}
}
虽然我反而想要:
{
"Capabilities":{
"ProcessOfferings":{ },
"Languages":{ },
"ServiceIdentification":{ },
"ServiceProvider":{ },
"OperationsMetadata":{ },
"version":"1.0.0",
"updateSequence":"1",
"service":"WPS",
"lang":"en-US"
}
}
真实对象类型T
由 JAXBElement 包装。这可能发生在某些根元素上,也可能嵌套在对象树中的任何位置。如果我调用 getValue()
在那我会得到真实的对象。但是当 JAXBElement<T>
时我不能这样做不是根元素,因为 Jackson 是 JAXB 和 JSON 之间的唯一解释器,我既不能改变 JAXB 绑定(bind),也不能改变创建的对象(代码的其他一些部分也使用它们)。
所以我发现可能解决问题的是 MixIns :
// a mixin annotation that overrides the handling for the JAXBElement
public static interface JAXBElementMixin<T> {
@JsonValue
Object getValue();
}
ObjectMapper mapper = new ObjectMapper();
JaxbAnnotationModule module = new JaxbAnnotationModule();
mapper.registerModule(module);
mapper.addMixInAnnotations(JAXBElement.class, JAXBElementMixin.class);
这解决了附加元素的问题,但导致对象的名称为 JAXBElement
而不是 T
(以我为例 Capabilities
):
{
"JAXBElement":{ // <------ Should be 'Capabilities' because of type JAXBElement<Capabilities>
"ProcessOfferings":{ },
"Languages":{ },
"ServiceIdentification":{ },
"ServiceProvider":{ },
"OperationsMetadata":{ },
"version":"1.0.0",
"updateSequence":"1",
"service":"WPS",
"lang":"en-US"
}
}
问题:
知道我可以做什么(也许注释 JAXBElementMixin<T>
)来获得正确的类型 Capabilities
作为对象名称(还有其他类而不是 Capabilities
也可以作为 T
放置)?
任何其他想法如何跳过任何 JAXBElement<T>
的序列化对象树中的任何位置,并继续对其 getValue()
后面的对象进行序列化方法?
最佳答案
这不是您问题的直接答案,但可能是实现您目标的秘诀。
如果您只是想摆脱最顶层的 JAXBElement
,为什么不自定义 XJC 来为您的 Capabilities
元素生成一个额外的类?
类似于:
<jaxb:bindings node="xs:element[@name='Capabilities']">
<jaxb:class name="Capabilities"/>
</jaxb:bindings>
这应该生成一个用“@XmlRootElement”注释的类 Capabilities
。因此,您将摆脱 JAXBElement
。
关于java - Jackson MixIn 将泛型类 JAXBElement<T> 替换为 getValue() 后面的 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27543072/
在 FireBaseDp 中检索数据时,可以使用上述方法之一来获取值。我想知道有什么区别(任何优点/缺点)? 最佳答案 确切的行为取决于您提取的数据类型。 如果您要提取字符串值,则两个代码段的行为是相
我在 output1 和 output2 中得到了不同的结果。第一个给了我在注册表中实际看到的值,而后者只给了我默认值。我想念什么? String output1 = Registry.GetValu
我正在使用Kotlin多平台构建iOS框架,除奇怪的问题外,其他一切都运行良好。 来自Kotlin的代码: fun example(): Map { val result = muta
我最近一直在开发一些 JSF 应用程序,并且对 Web 组件 API 的不一致感到不安。 我注意到在服务器端代码中的 JSF 组件对象上调用 .getValue() 或 .getSubmittedVa
我正在开发 JavaFX 表单。该表单应该获取值并将其添加到数据库中。每当我尝试通过 .getValue 获取值时,它都会产生错误 Incompatible Types: Object cannot
我有下面的代码, var data = new Dictionary { { "A1", new TestData { Name = "N1",
返回的错误是: "TypeError: Cannot call method "getValues" of undefined. (line 7, file "Code")" function set
在 Google 表格中,将范围内的数据存储到数组中作为脚本的一部分,然后检查特定列中是否有“Y”,这样我就可以遍历并将这些列存储在新数组中。 我有以下代码,但出现此错误 - “TypeError:无
我正在尝试编写一个通用方法来比较两个对象(我有意引入两种不同的类型。第二个具有与第一个相同的属性。第一个具有更多属性。)。 我想确保属性具有相同的值。以下代码适用于我在对象中拥有的大多数属性,但偶尔会
我写了这门课。这不是原始类的完整描述,为了使我的问题陈述简洁,我给出了所需的内容 template class RB { class Child { members are Child ar
我正在尝试根据我的团队在工作中使用的项目跟踪表来设置电子邮件警报系统。当 K 列中的任务状态更改为“完成”时,我需要它发送电子邮件。我得到了可以在测试表上运行的代码,但是当我将其复制到实时表时, ge
尝试创建获取任何枚举属性值的枚举扩展方法时,我遇到了以下情况: 编译以下代码时,VS 2010 显示错误:“GetValue”方法没有重载需要 1 个参数。注释代码和使用监视工具时 - 该行返回值(见
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想转换一个 Map>所以它变成了Map .如果它只是 Map在 Java8 中很容易; stream().collect(k -> k.getValue().getMyKey(), Entry::g
我目前正在使用 Scene Builder 制作 javafx 场景。我想以特定格式从日期选择器中获取值。只需使用 datePicker.getValue() 即可以 yyyy-mm-dd 形式返回日
问题是我们无法获取仅存在于具有泛型类型的基类中的字段(非泛型)的值。请看下面的代码片段。呼唤 f.GetValue(a) 将抛出异常消息:后期绑定(bind)操作不能在类型为 Type.Contain
为什么会这样: $RegistryKeys = (Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\services\VMSMP\Parameters\
我试图让我的函数在另一张表的表中查找值。 表格的行用数字标记,但列用字符串命名。 这是我的功能代码 Function GetValue(row As String, col As String)
我试图模拟顶级(不是任何部分的一部分)配置值(.NET Core 的 IConfiguration),但徒劳无功。例如,这些都不起作用(使用 NSubstitute,但它与 Moq 或我相信的任何模拟
我得到了一个代码,它从一个名为频率的列表中获取所有最小值。然后它将最小值与总值的百分比放入一个字符串中。要计算百分比,我想调用 minEntryes.getValue()(minEntryes 是 M
我是一名优秀的程序员,十分优秀!