gpt4 book ai didi

java - jackson 序列化 Collections.unmodifiable*

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:03 30 4
gpt4 key购买 nike

我在使用来自 json 的 Jackson 序列化时遇到问题,如何从 Collections.unmodifiableMap 序列化?

我得到的错误是:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.util.Collections$UnmodifiableMap, problem: No default constructor found

我想使用 http://wiki.fasterxml.com/SimpleAbstractTypeResolver 中的 SimpleAbstractTypeResolver但是我无法获得内部类类型 Collections$UnmodifiableMap

Map<Integer, String> emailMap = newHashMap();
Account testAccount = new Account();
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, As.PROPERTY);
String marshalled ;
emailMap.put(Integer.valueOf(10), "bob@mail.com");
testAccount.setMemberEmails(emailMap);

marshalled = mapper.writeValueAsString(testAccount);
System.out.println(marshalled);
Account returnedAccount = mapper.readValue(marshalled, Account.class);
System.out.println(returnedAccount.containsValue("bob@mail.com"));


public class Account {
private Map<Integer, String> memberEmails = Maps.newHashMap();

public void setMemberEmails(Map<Integer, String> memberEmails) {
this.memberEmails = memberEmails;
}

public Map<Integer, String> getMemberEmails() {
return Collections.unmodifiableMap(memberEmails);
}

有什么想法吗?提前致谢。

最佳答案

好的,您遇到了 Jackson 的边缘类型案件。真正的问题是库会愉快地使用您的 getter 方法来检索集合和映射属性,并且只有在这些 getter 方法返回 null 时才会回退到实例化这些集合/映射。

这可以通过组合使用 @JsonProperty/@JsonIgnore 注释来解决,但需要注意的是,JSON 输出中的 @class 属性会发生变化。

代码示例:

public class Account {
@JsonProperty("memberEmails")
private Map<Integer, String> memberEmails = Maps.newHashMap();

public Account() {
super();
}

public void setMemberEmails(Map<Integer, String> memberEmails) {
this.memberEmails = memberEmails;
}

@JsonIgnore
public Map<Integer, String> getMemberEmails() {
return Collections.unmodifiableMap(memberEmails);
}
}

如果您使用测试代码序列化此类,您将获得以下 JSON:

{
"@class": "misc.stack.pojo.Account",
"memberEmails": {
"10": "bob@mail.com",
"@class": "java.util.HashMap"
}
}

这将正确反序列化。

关于java - jackson 序列化 Collections.unmodifiable*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612301/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com