带有保留字符的类型安全 ConfigFactory 错误

问题描述 投票:0回答:2

嗨,我正在尝试从 Java 中的字符串加载配置,如下所示:

@Test
public void testIllegalCharacter(){
    String input = "prop=\\asd";
    Config conf = ConfigFactory.parseString(input);
}

上面的代码产生以下错误:

com.typesafe.config.ConfigException$Parse: String: 1: Expecting a value but got wrong token: '\' (Reserved character '\' is not allowed outside quotes) (if you intended '\' (Reserved character '\' is not allowed outside quotes) to be part of a key or string value, try enclosing the key or value in double quotes, or you may be able to rename the file .properties rather than .conf)

我知道我的字符串中有非法字符。虽然我如何找到完整的非法字符集?

如果我(例如)将此字符串转换为

Properties
对象,然后用
ConfigFactory.parseProperties
解析它,我可以看到值
"\\asd"
解析为
"asd".
所以一定有一些 sanitising 正在进行类型安全库,我希望我自己可以称之为清理,但我不知道如何做。解析为属性并不是一个可行的解决方案,因为配置也可以由对象或列表组成。

有人对如何解决这个问题有任何建议吗?

或者有人可以指出所有保留的字符集吗?

非常感谢

java typesafe hocon
2个回答
0
投票

如果我正确理解错误消息,您应该在特殊字符周围加上引号,例如像这样:

"prop=\"\\asd\"";

不确定为什么你想要一个带有反斜杠 (' ') 的属性定义,但我想我不需要知道:-)


0
投票

我想我可能已经找到答案了。我需要设置

ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES)

适用于以下测试:

@Test
    public void test(){
        String input = "prop=C:/MyDocuments/mydir";
        Config conf = ConfigFactory.parseString(input, ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES));
        assertEquals("C:/MyDocuments/mydir", conf.getAnyRef("prop"));
    }

但不适用于带有反斜杠的测试

@Test
    public void test(){
        String input = "prop=C:\\MyDocuments\\mydir";
        Config conf = ConfigFactory.parseString(input, ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES));
        assertEquals("C:\\MyDocuments\\mydir", conf.getAnyRef("prop"));
    } 

失败:

org.junit.ComparisonFailure: 
Expected :C:\MyDocuments\mydir
Actual   :C:MyDocumentsmydir

所以我不确定这是最终的答案...

© www.soinside.com 2019 - 2024. All rights reserved.