如何将特定格式的字符串解析成HashMap?

3

我有一个以特定格式传入的字符串,所以我想将该字符串解析为映射。我有下面这个方法将字符串解析为映射,它可以正常工作。

  public static Map<String, String> parseStringToMap(String payload) {
    Map<String, String> map = new HashMap<>();
    try {
      for (String part : payload.split("\\|")) {
        String[] subparts = part.split("=", 2);
        map.put(subparts[0], subparts[1]);
      }
    } catch (Exception ex) {
    }
    return map;
  }

字符串的示例:

"type=3|Id=23456|user=13456"
"type=3|Id=23456|user=13456|type=3"

在我的可变映射中,同一个键可能会出现多次。因此,我需要覆盖该键的值。

另外,如果我的字符串负载不符合以下格式,则希望返回空映射。我的字符串格式始终如此,如果不符合此格式,则将返回空映射。目前,我不确定如何添加此逻辑,以便在出现此情况时返回空映射?

"a=b|c=d|e=f"   

我正在使用Java 7。最好和高效的方法是什么?

我的规范只有这个。我的字符串格式始终如下:

"a=b|c=d|e=f"

它不会以任何特殊字符开头。


1
请更新您的问题说明。如果这是FIX协议,那么可能已经有库可用于解析它。 - Tim Biegeleisen
我刚刚更新了它。如果您有任何问题,请告诉我。它将始终保持这种格式。 - user1950349
1个回答

2

使用正则表达式确保传入的负载字符串具有正确的格式:

public static Map<String, String> parseStringToMap(String payload) {
    Map<String, String> map = new HashMap<>();
    if (!payload.matches("[A-Za-z0-9]+=[A-Za-z0-9]+(\\|[A-Za-z0-9]+=[A-Za-z0-9]+)*")) {
        // return empty map
        return map;
    }

    // your original code here
}

关于您对同一键出现多次的担忧,哈希表的默认行为是覆盖,因此在这种情况下您可能已经得到了保护。只需按照它们出现的顺序编写键/值对,您就会自动用新值覆盖旧值。


1
你从来没有在任何地方提到冒号有特殊含义。我不会无限制地更改我的答案以满足你的要求。 - Tim Biegeleisen
1
如果你告诉我们规格,也许我的答案可以简单地更新。 - Tim Biegeleisen
@user1950349,那你为什么要抱怨 :a=b|c=d|e=f 呢? - user207421
@user1950349 我修改了我的答案,使得你的消息的第一个字符只能是字母和数字。 - Tim Biegeleisen
@EJP 我的意思是,如果有人在它前面开始发送一些字符,那么我应该失败并返回空映射。 - user1950349
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接