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

为什么我不能打开根节点并反序列化对象数组?

颜志学
2023-03-14

为什么我不能通过解包根节点来反序列化对象数组?

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonRootName;
import org.junit.Assert;
import org.junit.Test;

public class RootNodeTest extends Assert {

    @JsonRootName("customers")
    public static class Customer {
        public String email;
    }

    @Test
    public void testUnwrapping() throws IOException {
        String json = "{\"customers\":[{\"email\":\"hello@world.com\"},{\"email\":\"john.doe@example.com\"}]}";
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
        List<Customer> customers = Arrays.asList(mapper.readValue(json, Customer[].class));
        System.out.println(customers);
    }
}

我一直在翻阅Jackson文档,这是我能找到的,但在运行它时,我发现了以下错误:

A org.codehaus.jackson.map.JsonMappingException has been caught, Root name 'customers' does not match expected ('Customer[]') for type [array type, component type: [simple type, class tests.RootNodeTest$Customer]] at [Source: java.io.StringReader@49921538; line: 1, column: 2]

我想在不创建包装类的情况下完成此操作。虽然这是一个示例,但我不想仅为解包装根节点而创建不必要的包装类。

共有3个答案

裴令秋
2023-03-14

此代码对我有效:

import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class RootNodeTest extends Assert {

public static class CustomerMapping {
    public List<Customer> customer;

    public List<Customer> getCustomer() {
        return customer;
    }

    public static class Customer {
        public String email;

        public String getEmail() {
            return email;
        }
    }

}

@Test
public void testUnwrapping() throws IOException {
    String json = "{\"customer\":[{\"email\":\"hello@world.com\"},{\"email\":\"john.doe@example.com\"}]}";
    ObjectMapper mapper = new ObjectMapper();
    CustomerMapping customerMapping = mapper.readValue(json, CustomerMapping.class);
    List<CustomerMapping.Customer> customers = customerMapping.getCustomer();
    for (CustomerMapping.Customer customer : customers) {
        System.out.println(customer.getEmail());
    }
  }
}

首先,整个json对象需要一个java对象。在我的例子中,这是CustomerMapping。然后需要一个java对象作为客户密钥。在我的例子中,这是内部类CustomerMapping。顾客因为customer是一个json数组,所以需要一个CustomerMapping列表。客户对象。此外,您不需要将json数组映射到java数组,然后将其转换为列表。杰克逊已经为你做了。最后,您只需指定String类型的变量email并将其打印到控制台。

郎羽
2023-03-14

似乎你不能逃脱包装类。根据这一点,@JsonRootName注释将只允许你打开一个包含你的pojo的单个实例的json:所以它将适用于这样的字符串:"{\"客户\":{\"电子邮件\":\"hello@world.com \"}}";

谢志文
2023-03-14

创建一个ObjectReader来显式配置根名称:

@Test
public void testUnwrapping() throws IOException {
    String json = "{\"customers\":[{\"email\":\"hello@world.com\"},{\"email\":\"john.doe@example.com\"}]}";
    ObjectReader objectReader = mapper.reader(new TypeReference<List<Customer>>() {})
                                      .withRootName("customers");
    List<Customer> customers = objectReader.readValue(json);
    assertThat(customers, contains(customer("hello@world.com"), customer("john.doe@example.com")));
}

(顺便说一句,这是Jackson 2.5的版本,你有不同的版本吗?我有反序列化功能而不是反序列化配置功能)

通过以这种方式使用对象读取器,您似乎不需要全局配置“展开根值”功能,也不需要使用注释。

另请注意,您可以直接请求列表

 类似资料:
  • 除非缓存放入是内部的,否则此代码路径中不会发生缓存放入。我提到这一点是因为另一篇文章的评论,即“未知对”可能是由错误类型的缓存放置造成的。 我正专注于 未能反序列化对象[typename=org.apache.ignite.internal.processors.closure.gridclosureprocessor$C2]

  • 我该怎么做才能使这件事如我所愿?。谢谢 JSON对象示例列表 示例JSON对象: null 忽略不存在json字段的反序列化错误,但问题仍然存在。 示例:对象反序列化器

  • 我试图使用流按国籍对我的对象进行分组并打印出来。 但是它说:"不能解析方法'println"

  • 所以我只是从移动到。像往常一样,一个看似简单的变化之后是一些副作用,包括吞下异常——抱歉咆哮。 这是我过去访问用户主体的方式: 出于某种原因,总是只返回用户名,而不是对象。这对我来说已经足够好了,所以我就这么做了。 现在我已经更改了令牌存储,确实返回了对象。我可以忍受这一点,但我想知道为什么这突然改变了——因为这一点,我不得不重构一些代码,因为到目前为止,我一直期望用户名来自。我也想知道我是否能改

  • 我试图在Java中序列化,但在运行我的程序时,我收到一个。 查看类,我注意到它没有实现。 为什么不实现?

  • 问题内容: 我有由第三方编码为固定长度数组的json’ed 元组数组: 我想使用json魔术来获取的实例列表 请帮助我放置适当的注释,以使ObjectMapper发挥作用。 我无法控制传入的格式,而我所有的google’n都以答案来回答如何将适当的json对象(而非数组)数组映射到对象列表 问题答案: 添加以下注释: 并且它应该根据需要序列化条目。 另外:然后使用它来强制执行特定顺序是最安全的,因