Как я могу избежать недопустимых символов имени поля Mongo с помощью Jackson ObjectMapper?

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

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

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


person TTT    schedule 13.03.2020    source источник


Ответы (1)


Вы можете реализовать пользовательское делегирование 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.

person TTT    schedule 13.03.2020