В настоящее время мои приложения могут выполнять следующие действия. Он может считывать конфигурацию JSON, такие как:JsonParser Augment jackson
{
"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();
}
}
Тогда мы можем вызвать функцию добавить возвращающие результат 8 в этом примере. Я хотел бы увеличить com.fasterxml.jackson.databind как-то, чтобы позволить моему JSON иметь заполнители. Так скажем, когда моя конфигурация я не знаю, что значение б будет до выполнения, то я мог бы сделать конфигурацию, как это:
{
"a": 5,
"b": $b_placeholder$
}
чтобы показать, что значение б будет обеспечиваться во время выполнения. Очевидно, что приведенное выше не является допустимым JSON, и по умолчанию Джексон бросает Exception (как следует), когда он пытается разобрать это с помощью readMalper ObjectMapper. В идеале, я хотел бы прочитать выше «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 ("Ъ "," b_placeholder ") вместо того, чтобы устанавливать значение b, и поэтому, когда вызывается add, он будет использовать значения в переданной в runtimeConf Map вместо значений из JSON для выполнения своей конфигурации.
Учитывая это, у меня есть 2 вопроса:
есть более простой путь для достижения своей цели иметь «заполнители» в моей конфигурации JSON? Кажется, если бы я должен был реализовать свою идею здесь, мне пришлось бы переопределить некоторые из классов Джексона. Я должен был бы переопределить com.fasterxml.jackson.core.JsonParser, чтобы разрешить $ как действительный токен в некоторых сценариях, мне также пришлось бы писать пользовательские derserializers для всей моей конфигурации POJO (например, AddConf). Это, скорее всего, привело бы к тому, что мне пришлось переопределить большую часть базы кода Джексона, чего я бы предпочел не делать.
Если бы я принял этот подход, чтобы переопределить некоторые классы по умолчанию джексона, как я могу это сделать?
настоящее время я использую Джексоном 2.6.0
Проверьте использование '@ JsonCreator' в конструкторе, так называемом * delegate * constructor. И, возможно, вы можете сделать placeholder строковым атрибутом, поэтому он действительно json, и вам не нужно работать с данными, отличными от json. –