Java 增强jackson';JsonParser

Java 增强jackson';JsonParser,java,json,jackson,Java,Json,Jackson,目前,我的应用程序可以执行以下操作。它可以读取JSON配置,例如: { "a": 5, "b": 3 } 变成一个POJO,看起来像: public class AddConf { private Number a; private Number b; // constructor, getters and setters public int add() { return a.intValue() + b.intValue(); } } 然后我们可以调用

目前,我的应用程序可以执行以下操作。它可以读取JSON配置,例如:

{
  "a": 5,
  "b": 3
}
变成一个POJO,看起来像:

public class AddConf {
  private Number a;
  private Number b;
  // constructor, getters and setters
  public int add() {
    return a.intValue() + b.intValue();
  }
}
然后我们可以调用add函数,在本例中返回结果8。我想以某种方式扩展com.fasterxml.jackson.databind,以允许我的JSON具有占位符。假设我的配置在运行时之前不知道b值是多少,那么我可能会进行如下配置:

{
  "a": 5,
  "b": $b_placeholder$
}
public class AddConf {
  private Map<String,String> usedPlaceholders;
  private Number a;
  private Number b;
  // constructor, getters and setters
  public int add(Map<String,String> runtimeConf) {
    if (usedPlaceholders.contains("a")) {  // if "a" was a placeholder
      a = runtimeConf.get(usedPlaceholder.get("a"));
    }
    if (usedPlaceholders.contains("b")) {  // if "b" was a placeholder
      b = runtimeConf.get(usedPlaceholder.get("b"));
    }
    return a.intValue() + b.intValue();
  }
  public void setPlaceholder(String key, String value) {
    usedPlaceholder.put(key, value);
  }
}
表示将在运行时提供b值。显然,上述内容不是有效的JSON,默认情况下,jackson在尝试使用ObjectMapper的readValue解析此内容时会抛出一个异常(应该是这样的)。理想情况下,我希望将上面的“JSON”(或类似的内容)读入如下POJO:

{
  "a": 5,
  "b": $b_placeholder$
}
public class AddConf {
  private Map<String,String> usedPlaceholders;
  private Number a;
  private Number b;
  // constructor, getters and setters
  public int add(Map<String,String> runtimeConf) {
    if (usedPlaceholders.contains("a")) {  // if "a" was a placeholder
      a = runtimeConf.get(usedPlaceholder.get("a"));
    }
    if (usedPlaceholders.contains("b")) {  // if "b" was a placeholder
      b = runtimeConf.get(usedPlaceholder.get("b"));
    }
    return a.intValue() + b.intValue();
  }
  public void setPlaceholder(String key, String value) {
    usedPlaceholder.put(key, value);
  }
}
公共类AddConf{
私人地图使用者;
私人a号;
私人号码b;
//构造函数、getter和setter
公共int添加(映射运行时配置){
if(usedPlaceholders.contains(“a”){//if“a”是占位符
a=runtimeConf.get(usedPlaceholder.get(“a”));
}
if(usedPlaceholders.contains(“b”){//如果“b”是占位符
b=runtimeConf.get(usedPlaceholder.get(“b”);
}
返回a.intValue()+b.intValue();
}
public void setPlaceholder(字符串键、字符串值){
usedPlaceholder.put(键、值);
}
}
其思想是,当反序列化上面的扩展JSON时,它将调用setPlaceholder(“b”,“b_占位符”)而不是设置值b,因此当调用add时,它将使用传入的runtimeConf映射中的值而不是JSON中的值来进行配置

鉴于此,我有两个问题:

有没有更简单的方法来实现在JSON配置中使用“占位符”的目标?似乎如果我要在这里实现我的想法,我就必须重写一些Jackson类。在某些情况下,我必须重写com.fasterxml.jackson.core.JsonParser以允许$作为有效令牌,我还必须为所有配置POJO(如AddConf)编写自定义DerSerializer。这可能会让我不得不重写大部分jackson代码库,而我宁愿不这样做

如果我采用这种方法来覆盖一些默认的jackson类,我该怎么做呢


我目前正在使用jackson 2.6.0

您可能正在寻找注释
@JsonRawValue
,使用该注释可以指定包含为值的确切内容,同时还要注意添加必要的分隔符。

检查
@JsonCreator
在构造函数中的用法,即所谓的委托构造函数。也许您可以将占位符设置为字符串属性,这样它就是有效的json,您不必处理非json数据。