Как я могу избежать недопустимых символов имени Mon go с помощью Jackson ObjectMapper? - PullRequest
0 голосов
/ 13 марта 2020

Я использую Джексона ObjectMapper для анализа строки JSON до JsonNode, которую я затем пишу в Mon go. Это работает хорошо, за исключением случаев, когда в имени поля есть недопустимый символ (. или $).

Чтобы исправить это, я мог бы использовать Mon go 3.6+, но документы не рекомендуют это, упоминая, что, хотя . и $ теперь разрешены в именах полей, запросы все еще могут быть хитрыми. Поэтому я хотел бы избежать этих символов при разборе JSON.

Как я могу избежать . и $ при разборе JSON с использованием Джексона?

1 Ответ

0 голосов
/ 13 марта 2020

Вы можете реализовать пользовательское делегирование JsonParser, которое может быть предоставлено через JsonFactory.

Например:

new ObjectMapper(new MongoInvalidCharacterEscapingJsonFactory());
public class MongoInvalidCharacterEscapingJsonFactory extends JsonFactory {    @Override
    protected JsonParser _createParser(char[] aData, int anOffset, int aLength, IOContext aContext, boolean anIsRecyclable) throws IOException {
        return new MongoInvalidCharacterEscapingParser(super._createParser(aData, anOffset, aLength, aContext, anIsRecyclable));
    }

    @Override
    protected JsonParser _createParser(Reader aReader, IOContext aContext) throws IOException {
        return new MongoInvalidCharacterEscapingParser(super._createParser(aReader, aContext));
    }
}
class MongoInvalidCharacterEscapingParser extends JsonParserDelegate {
    MongoInvalidCharacterEscapingParser(JsonParser aMommy) {
        super(aMommy);
    }

    @Override
    public String getCurrentName() throws IOException {
        if (hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
            return delegate.getCurrentName().replaceAll("\\.", "REPLACEMENTFORPERIOD").replaceAll("\\$", "REPLACEMENTFORDOLLARSIGN");
        }

        return delegate.getCurrentName();
    }
}

Весь импорт из com.fasterxml.jackson.core и java.io.

...