当前位置: 首页 > 知识库问答 >
问题:

使用Jackson流API反序列化对象时的不一致性

金烨华
2023-03-14

我正在尝试使用Jackson流API从XML反序列化巨大的对象。其思想是结合流式API和ObjectMapper来按小块解析XML(或JSON)。但是,我看到了一些与XML解析器不一致的行为。使用以下代码段:

 try {
  String xml1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo></foo>";
  String xml2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo><bar></bar></foo>";
  XmlFactory xmlFactory = new XmlFactory();
  JsonParser jp = xmlFactory.createParser(new ByteArrayInputStream(xml1.getBytes()));
  JsonToken token = jp.nextToken();
  while (token != null) {
    System.out.println("xml1 token=" + token);
    token = jp.nextToken();
  }

  jp = xmlFactory.createParser(new ByteArrayInputStream(xml2.getBytes()));
  token = jp.nextToken();
  while (token != null) {
    System.out.println("xml2 token=" + token);
    token = jp.nextToken();
  }

} catch (IOException e) {
  e.printStackTrace();
}
    null

为什么XML1缺少FIELD_NAME标记?为什么第二个XML只有一个START_OBJECT令牌?是否有任何设置可以让我看到外部标记的FIELD_NAME?

共有1个答案

梁丘佑运
2023-03-14

问题很简单:XML模块不同于大多数其他Jackson dataformat模块,它不支持通过流API直接访问。在项目自述文件中提到了这一点(同时也提到了“树模型”同样不受支持)。不支持并不一定意味着“完全不能使用”,只是它的行为不同于JSON的处理,所以调用者真的需要知道他们在JSON内容使用的API之外正在做什么(还有Smile、CBOR、YAML--甚至CSV内容也是以与JSON访问兼容的方式表示的)。

虽然您可以尝试使用XMLFactory和流解析器/生成器,但它的行为由XMLMapper根据Java类的元数据控制,以便通过数据绑定API(即XMLMapper)使事情正常工作。

因此,观察到的令牌的原因是这样的转换对于映射到预期的Java对象结构是必要的:

  1. 知道XMLParserhtml" target="_blank">执行的转换,调用getToken()期望转换
  2. 不直接使用XMLParser,而是构造XMLStreamReader(Stax低级流解析器),读取“原始”标记,并在预期位置构造单独的XMLParser(通过XMLFactory),将其用于读取。

希望这能帮上忙。

 类似资料:
  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?

  • 使用com。fasterxml。杰克逊。数据绑定。ObjectMapper类(com.fasterxml.jackson.core:jackson-databind:2.9.5)我正在尝试反序列化以下类的对象: 我目前正在执行的代码如下: 在抛出异常的最后一行失败: 通用域名格式。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法构造com的实例。

  • 我正在尝试反序列化JSON对象,例如 Java子对象引用父对象的对象,例如: 像这样反序列化时,子对象#父对象不会指向父对象。我在做在线研究时读到了两种方法,但非似乎有效。 1.向类添加构造函数arg以设置父对象 执行此操作时,我得到错误: 2.使用和注释 此操作失败: JsonBackReference的JavaDoc说它不能应用于集合,所以它显然不起作用,但我想知道为什么在线上有这么多例子将它

  • 我有这样一个实体: 和相关的JSON: 我试图在Spring MVC@Controller中以如下方式对其进行反序列化: 添加