Java 增强jackson';JsonParser
目前,我的应用程序可以执行以下操作。它可以读取JSON配置,例如: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(); } } 然后我们可以调用
{
"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数据。