【问题标题】:How can I escape invalid Mongo field name characters with a Jackson ObjectMapper?如何使用 Jackson ObjectMapper 转义无效的 Mongo 字段名称字符?
【发布时间】:2020-03-13 13:52:08
【问题描述】:

我正在使用 Jackson ObjectMapper 将 JSON 字符串解析为 JsonNode,然后将其写入 Mongo。这可以正常工作,除非字段名称中存在无效字符(.$)。

要解决此问题,我可以使用 Mongo 3.6+,但文档不鼓励这样做,并提到即使现在允许在字段名称中使用 .$,查询可能仍然很棘手。因此,我想在解析 JSON 时转义这些字符。

在使用 Jackson 解析 JSON 时,如何转义 .$

【问题讨论】:

    标签: json mongodb jackson jackson-databind


    【解决方案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.corejava.io 的所有导入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多