2015-07-27 3 views
2

В настоящее время мои приложения могут выполнять следующие действия. Он может считывать конфигурацию 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

+0

Проверьте использование '@ JsonCreator' в конструкторе, так называемом * delegate * constructor. И, возможно, вы можете сделать placeholder строковым атрибутом, поэтому он действительно json, и вам не нужно работать с данными, отличными от json. –

ответ

0

Вы можете искать аннотацию @JsonRawValue, использование которого позволяет указать точное содержание включить в качестве значения, в то же время заботясь о добавлении необходимых сепараторов.

Смежные вопросы