为什么我不能通过解包根节点来反序列化对象数组?
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]
我想在不创建包装类的情况下完成此操作。虽然这是一个示例,但我不想仅为解包装根节点而创建不必要的包装类。
此代码对我有效:
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并将其打印到控制台。
似乎你不能逃脱包装类。根据这一点,@JsonRootName
注释将只允许你打开一个包含你的pojo的单个实例的json:所以它将适用于这样的字符串:"{\"客户\":{\"电子邮件\":\"hello@world.com \"}}";
创建一个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对象(而非数组)数组映射到对象列表 问题答案: 添加以下注释: 并且它应该根据需要序列化条目。 另外:然后使用它来强制执行特定顺序是最安全的,因