Java Jackson:使用类方法序列化POJO
我知道我可以使用Java Jackson:使用类方法序列化POJO,java,spring,jackson,Java,Spring,Jackson,我知道我可以使用(new ObjectMapper()).convertValue(this,ObjectNode.class)将给定对象序列化为JSON。有没有办法告诉lib使用该类中的方法序列化它 我的班级: interface A { ObjectNode toJSON(); } abstract class Tokens { Map<String, String> tokends; } class Foo extends Tokens implements A {
(new ObjectMapper()).convertValue(this,ObjectNode.class)
将给定对象序列化为JSON
。有没有办法告诉lib使用该类中的方法序列化它
我的班级:
interface A {
ObjectNode toJSON();
}
abstract class Tokens {
Map<String, String> tokends;
}
class Foo extends Tokens implements A {
private long id;
private Bar bar;
// Constructors, getters & setters...
@Override
public ObjectNode toJSON() {
ObjectNode node = (new ObjectMapper()).convertValue(this, ObjectNode.class);
tokens.forEach(node::put);
return node;
}
}
class Bar extends Tokens implements A {
private long id;
// Constructors, getters & setters...
@Override
public ObjectNode toJSON() {
ObjectNode node = (new ObjectMapper()).convertValue(this, ObjectNode.class);
tokens.forEach(node::put);
return node;
}
}
而不是:
{
"id": 1,
"bar": {
"id": 2,
"token3": "...",
"token4": "..."
},
"token1": "...",
"token2": "...:,
}
我知道这是因为第一个方法修改了序列化类,但当它进入子对象时,jackson没有调用它
有没有办法告诉jaskson使用
toJSON
方法来创建带有令牌的子对象?在toJSON()
方法上尝试Jackson注释@com.fasterxml.Jackson.annotation.JsonValue
。从javadoc:
标记注释类似于javax.xml.bind.annotation.XmlValue,它指示带注释的“getter”方法的结果(这意味着签名必须是getter的结果;非void返回类型,无args)将用作实例序列化的单个值。值通常是简单的标量类型(字符串或数字),但它可以是任何可序列化类型(集合、映射或Bean)
为了采用稍微不同的方法,提供了一种将
标记的键直接包含在父JSON中的方法:
abstract class Tokens {
Map<String, String> tokens = new LinkedHashMap<>();
@JsonAnyGetter
public Map<String, String> getTokens() {
return tokens;
}
@JsonAnySetter
public void addToken(String key, String value) {
tokens.put(key, value);
}
}
返回:
{
"id" : 1,
"bar" : {
"id" : 2,
"token3" : "three",
"token4" : "four"
},
"token1" : "one",
"token2" : "two"
}
用@JsonValue
注释Foo
、Bar
或这两个类toJSON
方法不会产生比我所做的任何结果Foo.toJSON().toString()
,我也不会得到任何回报。这正是我想要的。非常感谢你,我不知道我怎么会错过那条注释。花了一整天的时间想弄明白这件事。非常感谢。我会给你奖金,只是因为某些原因需要等20小时。这是过程的一部分,以确保有足够的时间提交完整的答案。
new ObjectMapper().writeValueAsString(foo);
{
"id" : 1,
"bar" : {
"id" : 2,
"token3" : "three",
"token4" : "four"
},
"token1" : "one",
"token2" : "two"
}