【问题标题】:Convert String into Key-Value Pair in Java在 Java 中将字符串转换为键值对
【发布时间】:2021-12-06 18:09:18
【问题描述】:

我知道我有一种使用分隔符分割的方法,但我拥有的字符串类似于 JSON。

这是字符串

[{type=Callback, output=[{name=prompt, value=InputCode}], input=[{name=IDT1, value=}]}, {type=TextOutputCallback, output=[{name=message, value={"current_type":"Code","info":{"some_key":"cf2fc86a","some_type":"Code","ph_no":"111111111"},"attempt":2}}]}]

现在我想以一种可以提取“尝试”的方式对其进行转换。所以,我想做这样的事情

String attempt = map.get("attempt");

问题在于这不是一个有效的 JSON,因为大多数值都不是双引号。 提取它的最佳方法是什么?

【问题讨论】:

  • 不太清楚:是否需要专门提取"attempt"键而不解析JSON?或者您需要将给定的字符串转换为一些 POJO,其中 value 可以是包含嵌套映射的 Map<String, Object>
  • 我需要专门从上面的字符串中提取“尝试”

标签: java json hashmap


【解决方案1】:

来自给定输入的映射使用正则表达式来匹配和解析一些值。

假设有效键被写为字母数字标识符,双引号内带有可选的下划线,并且值可以放在双引号内或作为整数,则可以实现以下模式并用于构建映射:

Pattern keyValue = Pattern.compile("(\"\\w+\")\\s*:\\s*(\"[^\"]+\"|\\d+(.\\d+)?)");
Map<String, String> map = keyValue.matcher(raw)
    .results()
    .collect(Collectors.toMap(
        kv -> kv.group(1).replace("\"", ""), // strip off double quotes
        kv -> kv.group(2).replace("\"", ""), // strip off double quotes
        (v1, v2) -> v1 // or join if needed String.join(";", v1, v2)
    ));

map.forEach((k, v) -> System.out.println(k + " -> " + v));
System.out.println("\n====\nattempt=" + map.get("attempt"));

输出:

ph_no -> 111111111
some_key -> cf2fc86a
some_type -> Code
attempt -> 2
current_type -> Code

====
attempt=2

【讨论】:

    【解决方案2】:

    假设String 结构没有改变并且attempt 是最后一个字段,您可以使用String 而无需将其转换为某些POJO 或Map

    public static String getAttempt(String json) {
        return json.split("\"attempt\":")[1].replaceAll("[^-?0-9]+", "");
    }
    

    那么你可以这样做:

    SString json = "[{type=Callback, output=[{name=prompt, value=InputCode}], input=[{name=IDT1, value=}]}, {type=TextOutputCallback, output=[{name=message, value={\"current_type\":\"Code\",\"info\":{\"some_key\":\"cf2fc86a\",\"some_type\":\"Code\",\"ph_no\":\"111111111\"},\"attempt\":2}}]}]";
    
    String attempt = getAttempt(json);
    
    System.out.pritnln(attempt);
    

    输出:

    2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2023-03-28
      • 2020-09-27
      • 2019-09-20
      • 2021-03-30
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多