增强杰克逊的JsonParser

时间:2015-07-27 18:56:11

标签: 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();
  }
}

然后我们可以在这个例子中调用add函数返回8的结果。我想以某种方式扩充com.fasterxml.jackson.databind以允许我的JSON拥有占位符。所以,让我们说我的配置在运行之前我不知道b的值是多少,那么我可能会做这样的配置:

{
  "a": 5,
  "b": $b_placeholder$
}

表示将在运行时提供b值。显然上面的内容不是有效的JSON,默认情况下,当jackson尝试使用ObjectMapper的readValue解析它时,会抛出异常(应该这样)。理想情况下,我想阅读以上内容" JSON" (或类似的东西)到一个看起来像这样的POJO:

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);
  }
}

这个想法是在上面反序列化增强的JSON时,它会调用setPlaceholder(&#34; b&#34;,&#34; b_placeholder&#34;)而不是设置值b,因此当调用add时,它将使用传入的runtimeConf Map中的值而不是JSON中的值来进行配置。

鉴于此,我有两个问题:

是否有更简单的方法来实现我的目标:&#34;占位符&#34;在我的JSON配置?看来如果我在这里实现我的想法,我将不得不覆盖一些杰克逊课程。在某些情况下,我必须覆盖com.fasterxml.jackson.core.JsonParser以允许$作为有效令牌,我还必须为我的所有配置POJO(例如AddConf)编写自定义derserializers。这可能会导致我不得不覆盖大部分杰克逊代码库,我宁愿不这样做。

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

我目前正在使用jackson 2.6.0

1 个答案:

答案 0 :(得分:0)

您可能正在寻找注释@JsonRawValue,使用它可以指定EXACT内容作为值包含,同时仍然需要添加必要的分隔符。