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
相关产品推荐
相关产品推荐

