地图中的符号和特殊字符作为键通过 YML 文件

Symbols and special characters in maps as keys THROUGH YML FILE

是否可以在Java中map中的key中存储:;/,.等字符通过application.yml?

映射

我试图通过 application.yml 文件中的映射来存储 URI 和与它们关联的值,但是由于它是一个键,它不会保存任何特殊字符

http://localhost:8080 变成 httplocalhost8080

有什么方法可以保留那些丢失的字符吗?

~~编辑~~ 我试过在键周围使用转义字符、双引号和单引号,但一旦它们出现在哈希图中,它们就会被忽略。

yml文件中的属性结构是这样的:

  uri-example-config:
    keyToValueMap:
      http://localhost:8080 : String1
      http://exmaple.com: String2
      http://moreURIs.com: String2

然后我的配置是:

@Configuration
@ConfigurationProperties(prefix = "uri-example-config")
@EnableConfigurationProperties
@Getter
@Setter
public class URIProperties {
    private Map<String, String> keyToValueMap = new HashMap<>();
}

~~~~编辑 2~~~~

是的,我可以轻松 map.put("http://localhost:8080"...) 并按预期保留字符串。 通过带有配置和属性的 yml 文件 执行此操作会导致此问题。

也许你可以像这样创建一个 URI

URI uri = new URI("http", null, "localhost", "8080", "/my/api");
String uriAsString = uri.toASCIIString();

然后将其作为字符串设置到您的地图中。

我建议你看看这个 post,你可能会在那里找到解决方案:

是的

对于 java 中的示例,您只需正确转义它即可。

    Map testmap=new HashMap<String,Object>();
    Object testObject="a value Object";
    testmap.put("http://localhost:8080",testObject);
    for (Object s:testmap.keySet()) {
        System.out.println(s);
    }

将打印出:

http://localhost:8080

Java HashMap 接受任何对象(字符串是一个对象)作为键! 此外,HashMap 不会 write/change 你的字符串。

我认为您的问题出在加载 .yml

Yaml 接受双引号中的特殊字符作为键。

- "http://localhost:8080"

检查你的序列化器/反序列化器

编辑 github of the project

上有解释

你应该用方括号括起你的字符串

- '[http://localhost:8080]'

是的,可以在 StringMap 中使用像 : ; / , . 这样的字符,如果键是 String 类型,那么 Map 可以接受任何包含任意字符的字符串。

密钥应该是实现 equalshashCode 方法的 class 类型。如果这些方法不可用,那么它们将从 Object class 继承。