- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是我的类(class):
@XmlRootElement(name="Zoo")
class Zoo {
//@XmlElementRef
public Collection<? extends Animal> animals;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Bird.class, Cat.class, Dog.class})
@XmlDiscriminatorNode("@type")
abstract class Animal {
@XmlElement
public String name;
}
@XmlDiscriminatorValue("Bird")
@XmlRootElement(name="Bird")
class Bird extends Animal {
@XmlElement
public String wingSpan;
@XmlElement
public String preferredFood;
}
@XmlDiscriminatorValue("Cat")
@XmlRootElement(name="Cat")
class Cat extends Animal {
@XmlElement
public String favoriteToy;
}
@XmlDiscriminatorValue("Dog")
@XmlRootElement(name="Dog")
class Dog extends Animal {
@XmlElement
public String breed;
@XmlElement
public String leashColor;
}
这是序列化的 JSON:
{
"animals": [
{
"type": "Bird",
"name": "bird-1",
"wingSpan": "6 feets",
"preferredFood": "food-1"
},
{
"type": "Cat",
"name": "cat-1",
"favoriteToy": "toy-1"
},
{
"type": "Dog",
"name": "dog-1",
"breed": "bread-1",
"leashColor": "black"
}
]
}
这是反序列化程序代码:
public static <T> T Deserialize_Moxy(String jsonStr, Class<?>[] cl) throws JAXBException {
InputStream is = new ByteArrayInputStream(jsonStr.getBytes());
JAXBContext jc = JAXBContext.newInstance(cl);
Unmarshaller unmarshaller = jc.createUnmarshaller();
// Marshal to JSON
unmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
unmarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
@SuppressWarnings("unchecked")
T obj = (T)unmarshaller.unmarshal(is);
return obj;
}
异常(exception)情况:
Exception in thread "main" javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element was not found in the project]
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.handleXMLMarshalException(JAXBUnmarshaller.java:1014)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:147)
at com.bp.samples.json.generics.Foo.Deserialize_Moxy(Foo.java:271)
at com.bp.samples.json.generics.Foo.main(Foo.java:111)
Caused by: Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element was not found in the project
at org.eclipse.persistence.exceptions.XMLMarshalException.noDescriptorWithMatchingRootElement(XMLMarshalException.java:143)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshallerHandler.startElement(SAXUnmarshallerHandler.java:222)
at org.eclipse.persistence.internal.oxm.record.json.JSONReader.parseRoot(JSONReader.java:161)
at org.eclipse.persistence.internal.oxm.record.json.JSONReader.parse(JSONReader.java:118)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:827)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:350)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:334)
at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:407)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:133)
... 2 more
还有一个关于序列化 JSON 的问题:有没有办法让 JSON 序列化程序发布“@type”而不是“type”。目前,它看起来像具有“类型”属性的对象。如果我们可以用“@”装饰它,那么它更像是一个类型信息而不是一个属性会更明显。
谢谢,贝扎德
最佳答案
以下是我对你的两个问题的回答:
问题 #1 - 异常
当您使用 MarshallerProperties.JSON_INCLUDE_ROOT
属性关闭根元素时,您需要使用采用 Class
的 unmarshal
方法之一> 用于告诉 MOXy 您希望解码的对象类型的参数。
StreamSource json = new StreamSource("src/forum14246033/input.json");
Zoo zoo = unmarshaller.unmarshal(json, Zoo.class).getValue();
问题#2
Also a question on the serialized JSON: Is there a way to get the JSON serializer to publish "@type" instead of "type". Currently, it looks like the objects having the property "type". If we could decorate it with "@", it will be more obvious that this is more of a type info than a property.
@
前缀表示字段/属性映射到 XML 属性。您可以使用 JAXBContextProperties.JSON_ATTRIBUTE_PREFIX
属性指定前缀以限定映射到 XML 属性的数据。
properties.put(JAXBContextProperties.JSON_ATTRIBUTE_PREFIX, "@");
完整示例
演示
package forum14246033;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(2);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
properties.put(JAXBContextProperties.JSON_ATTRIBUTE_PREFIX, "@");
JAXBContext jc = JAXBContext.newInstance(new Class[] {Zoo.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource("src/forum14246033/input.json");
Zoo zoo = unmarshaller.unmarshal(json, Zoo.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(zoo, System.out);
}
}
input.json/输出
{
"animals" : [ {
"@type" : "Bird",
"name" : "bird-1",
"wingSpan" : "6 feets",
"preferredFood" : "food-1"
}, {
"@type" : "Cat",
"name" : "cat-1",
"favoriteToy" : "toy-1"
}, {
"@type" : "Dog",
"name" : "dog-1",
"breed" : "bread-1",
"leashColor" : "black"
} ]
}
领域模型
我不建议在您的域模型中使用公共(public)字段,但如果您这样做,您可以将元数据减少为以下内容:
动物园
import java.util.Collection;
class Zoo {
public Collection<? extends Animal> animals;
}
动物
import javax.xml.bind.annotation.XmlSeeAlso;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;
@XmlSeeAlso({Bird.class, Cat.class, Dog.class})
@XmlDiscriminatorNode("@type")
abstract class Animal {
public String name;
}
鸟
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;
@XmlDiscriminatorValue("Bird")
class Bird extends Animal {
public String wingSpan;
public String preferredFood;
}
jaxb.properties
要将 MOXy 指定为您的 JAXB (JSR-222) 提供程序,您需要在与域模型相同的包中包含一个名为 jaxb.properties
的文件,其中包含以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
关于java - MOXy反序列化异常: A descriptor with default root element was not found in the project,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246033/
我在嵌入式 Jetty 9.x 服务器内使用 Jersey 2.x 和内置的 MOXy 转换从 JSONPOJO。 是否可以以编程方式(在 POJO 上没有注释)为特定类型(例如 Joda DateT
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
Moxie看起来很驼鹿,但标题信息量不大, Moxie - Not Another Moose Clone 看了一下,好像用了 B::CompilerPhase::Hook 额外的伏都教。这个库的最终
我有一个基类声明如下: package com.mystuff.surrogates; import java.io.Serializable; import java.util.UUID; publ
我正在使用 MOXy 2.5.1 以及 Jersey 2.4 和 Hibernate。我发现 MOXy 与一组特定的类有奇怪的编码行为。 我有一些与此类似的类(为简洁起见,删除了其他内容): publ
我正在使用 MOXy 来解码一个相对简单的 XML 文档,但我得到了不一致的行为。该文档由两个元素组成,其中包含基本信息(名称和日期),后跟记录列表。问题是名称和日期每次都正确解码,但是我经常得不到任
我按照指示here进行操作为了为我的带注释的类生成 XML 架构。我使用 MOXy 作为 JAXB 的底层实现,因为我需要它的某些功能,例如 @XmlPath 以及它如何处理 XmlAdapter 的
是否可以根据某些运行时信息有条件地仅输出元素(作为 XML 或 JSON)? 我自己找到了答案,并想与大家分享。 最佳答案 简单: return null 示例 我有一个列表“alertStems”和
我有一个非常简单的类,有两个字段,String sourceAddress 和 int port。 我希望它们映射到源/地址和源/端口节点而不是 jaxb 默认的 sourceAddress 和 so
使用EclipseLink MOXy JAXB实现,我试图使用@XmlPath批注基于元素的属性值获取元素值。我似乎无法正常工作。支持吗? XML摘录: ... 12345 blah POJO
我使用 moxy 来构建大型结构,在 95% 的情况下,它的效果就像 charme 一样。它快速且可靠。但我现在确实有一个具有相同类结构但数据不同的项目。现在我确实产生了很大的阅读影响。写完整的项目大
为了解决另一个问题,我已从使用 Jersey 转向使用 EclipseLink MOXy 从 JAXB 创建的对象模型(由 Sun JAXB 2.1.12 创建)生成 JSON。我注意到的一个区别是输
我有一个相当大的对象树,我想将其导出为 XML。名为 Person 的对象在多个地方使用(作为许多子实体的 userCreated、userModified、作为客户端等) 根据 Person 对象的
我正在使用 JAXB/MOXy 解码一个包含大约 50 个此类对象的 XML 文件: @XmlRootElement(name="Message") public class MyClass{ pri
我有一个使用 Jersey 和 MOXy 的 JAX-RS 服务。我有一个返回类型 Memo 的 JSON 或 XML(取决于 Accept: header )表示的处理程序,但如果找不到该项目,它应
我试图找到包含等同于 的类的 Maven 依赖项 import org.eclipse.persistence.oxm.annotations.XmlVariableNode; 这是我目前拥有的 PO
我正在定义一个静态工厂方法: @XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew") public abstract
我的问题是 this 的后续问题评论。 我在同一个类上混合使用 JPA 和 JAXB (MOXy) 注释,大多数情况下效果很好。如链接线程中所述,@XmlInverseReference 在编码双向关
我似乎无法让@XmlCData 注释起作用,即使 MOXy 已正确设置。 我的代码,attached , 输出: 1
我正在编写一段代码,使用 MOXy 在运行时设置 XmlTransient。以下是改编自 http://blog.bdoughan.com/2011/06/moxy-extensible-models
我是一名优秀的程序员,十分优秀!