当前位置: 首页 > 面试题库 >

Java 将URI字符串解析为Name-Value集合

金承嗣
2023-03-14
问题内容

我有这样的URI:

https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback

我需要一个具有解析元素的集合:

NAME               VALUE
------------------------
client_id          SS
response_type      code
scope              N_FULL
access_type        offline
redirect_uri       http://localhost/Callback

确切地说,我需要C#/。NET HttpUtility.ParseQueryString方法的Java等效项。

请给我一个建议。


问题答案:

如果你正在寻找一种无需使用外部库即可实现的方法,则以下代码将为你提供帮助。

public static Map<String, String> splitQuery(URL url) throws UnsupportedEncodingException {
    Map<String, String> query_pairs = new LinkedHashMap<String, String>();
    String query = url.getQuery();
    String[] pairs = query.split("&");
    for (String pair : pairs) {
        int idx = pair.indexOf("=");
        query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
    }
    return query_pairs;
}

你可以使用来访问返回的Map <map>.get("client_id"),并在问题中提供URL,这将返回“ SS”。

添加了更新 URL解码

更新由于此答案仍然很受欢迎,因此我对上述方法进行了改进,该方法可以处理具有相同键的多个参数以及没有值的参数。

public static Map<String, List<String>> splitQuery(URL url) throws UnsupportedEncodingException {
  final Map<String, List<String>> query_pairs = new LinkedHashMap<String, List<String>>();
  final String[] pairs = url.getQuery().split("&");
  for (String pair : pairs) {
    final int idx = pair.indexOf("=");
    final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
    if (!query_pairs.containsKey(key)) {
      query_pairs.put(key, new LinkedList<String>());
    }
    final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;
    query_pairs.get(key).add(value);
  }
  return query_pairs;
}

UPDATE Java8版本

public Map<String, List<String>> splitQuery(URL url) {
    if (Strings.isNullOrEmpty(url.getQuery())) {
        return Collections.emptyMap();
    }
    return Arrays.stream(url.getQuery().split("&"))
            .map(this::splitQueryParameter)
            .collect(Collectors.groupingBy(SimpleImmutableEntry::getKey, LinkedHashMap::new, mapping(Map.Entry::getValue, toList())));
}

public SimpleImmutableEntry<String, String> splitQueryParameter(String it) {
    final int idx = it.indexOf("=");
    final String key = idx > 0 ? it.substring(0, idx) : it;
    final String value = idx > 0 && it.length() > idx + 1 ? it.substring(idx + 1) : null;
    return new SimpleImmutableEntry<>(key, value);
}

使用网址运行上述方法

https://stackoverflow.com?param1=value1&param2=&param3=value3&param3

返回此地图:

{param1=["value1"], param2=[null], param3=["value3", null]}


 类似资料:
  • 我有这样的URI: 我需要一个包含解析元素的集合: 确切地说,我需要C#/.NET方法的Java等价物。

  • 问题内容: 我正在使用一种API,该API为我提供了XML,并且我需要从一个实际上是字符串的标签中获取一张地图。例: 有 我需要 问题在于字符串是完全动态的,因此它可以像 所以我不能只用逗号然后用等号分开。是否可以使用正则表达式将类似字符串的内容转换为地图? 到目前为止,我的代码是: 先感谢您 问题答案: 您可以使用 请参阅regex演示。 细节 -第1组:一个或多个单词字符 -等号 -第2组:除

  • 问题内容: 我有一个将存储Number对象的列表。该列表将通过分析字符串列表来填充,其中每个字符串都可以表示Number的任何子类。 如何将字符串解析为通用数字,而不是特定的整数或浮点数? 问题答案: 数字不能实例化,因为它是抽象类。我建议传入数字,但是如果您设置为字符串,则可以使用任何子类来解析它们, 要么 @请参阅NumberFormat

  • 问题内容: 如何在Java(Android)中将字符串转换为Uri?即: myUri = ???; 问题答案: 您可以使用静态方法从

  • 我试图用GMT解析一个表示日期的字符串,但它在我的PC(太平洋)上的时区中打印出来。当我运行下面的时,我得到下面的输出。关于如何让解析器解析并返回GMT日期有什么想法吗?如果您看下面,我正在使用format.settimezone(timezone.gettimezone(“GMT”))设置时区;但它并没有产生预期的结果。 以下代码的输出: 10月29日星期一05:57:00 PDT 2012

  • 将一个 cookie name-value 对序列化为 Set-Cookie 头字符串。 使用模板字面量和 encodeURIComponent() 来创建合适的字符串。 const serializeCookie = (name, val) => `${encodeURIComponent(name)}=${encodeURIComponent(val)}`; serializeCookie(