Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson:使用类方法序列化POJO_Java_Spring_Jackson - Fatal编程技术网

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"
}