You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何将含集合属性的请求查询字符串解析为JSON结构字符串?

嘿,这个问题我之前在项目里刚好遇到过!要把带集合类型的查询字符串转成合法的JSON结构,Java里有不少现成的工具库能帮你搞定,完全不用自己手动写复杂的解析逻辑,给你推荐几个靠谱的方案:

方案1:用Spring框架的UriComponentsBuilder(适合Spring项目)

如果你的项目是基于Spring的,那UriComponentsBuilder绝对是最省心的选择——它能自动识别重复的参数键,并把它们打包成集合,之后配合Jackson的ObjectMapper就能直接转成JSON。

示例代码:

import org.springframework.web.util.UriComponentsBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

public class QueryStringConverter {
    public static void main(String[] args) throws Exception {
        // 模拟带集合参数的查询字符串
        String queryString = "name=Alice&address=123 Main St&hobbies=reading&hobbies=hiking&scores=90&scores=85";
        
        // 解析查询字符串为支持多值的MultiValueMap
        var queryParams = UriComponentsBuilder.fromUriString("http://dummy.com/?" + queryString)
                .build()
                .getQueryParams();
        
        // 直接用Jackson序列化MultiValueMap,自动处理集合
        ObjectMapper mapper = new ObjectMapper();
        String jsonResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(queryParams);
        
        System.out.println(jsonResult);
    }
}

这段代码的输出会是:

{
  "name" : ["Alice"],
  "address" : ["123 Main St"],
  "hobbies" : ["reading", "hiking"],
  "scores" : ["90", "85"]
}

方案2:用Apache Commons HttpClient的URLEncodedUtils(通用Java项目)

如果你的项目没用到Spring,Apache Commons HttpClient里的URLEncodedUtils是个很好的替代方案,它同样能解析带重复键的查询字符串,再通过Stream API整理成Map后转JSON。

示例代码:

import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.NameValuePair;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class QueryStringConverter {
    public static void main(String[] args) throws Exception {
        String queryString = "name=Bob&tags=java&tags=spring&age=30";
        
        // 解析查询字符串为NameValuePair列表
        List<NameValuePair> paramPairs = URLEncodedUtils.parse(queryString, StandardCharsets.UTF_8);
        
        // 将列表分组为Map<String, List<String>>,自动合并相同键的多个值
        Map<String, List<String>> paramMap = paramPairs.stream()
                .collect(Collectors.groupingBy(
                        NameValuePair::getName,
                        Collectors.mapping(NameValuePair::getValue, Collectors.toList())
                ));
        
        // 转成JSON字符串
        ObjectMapper mapper = new ObjectMapper();
        String jsonResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(paramMap);
        
        System.out.println(jsonResult);
    }
}

额外优化:让单值字段显示为单个值而非数组

上面的方案会把所有字段都转成数组(哪怕只有一个值),如果想让单值字段直接显示为字符串,可以加个简单的工具方法处理Map:

private static Map<String, Object> normalizeParamMap(Map<String, List<String>> inputMap) {
    return inputMap.entrySet().stream()
            .collect(Collectors.toMap(
                    Map.Entry::getKey,
                    entry -> entry.getValue().size() == 1 ? entry.getValue().get(0) : entry.getValue()
            ));
}

把这个方法加到上面的代码里,用normalizeParamMap(paramMap)替代原有的paramMap,输出的JSON就会变成:

{
  "name" : "Alice",
  "address" : "123 Main St",
  "hobbies" : ["reading", "hiking"],
  "scores" : ["90", "85"]
}

这样就更符合常规的JSON结构啦!

内容的提问来源于stack exchange,提问作者Ayane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:38:45