目前我的应用程序可以执行以下操作。它可以读取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
答案 0 :(得分:0)
您可能正在寻找注释@JsonRawValue
,使用它可以指定EXACT内容作为值包含,同时仍然需要添加必要的分隔符。