如何在Java HttpClient的JSON请求体中传入变量
实现Java HttpClient POST请求动态替换JSON请求体变量的方案
方法1:直接字符串拼接(适合简单JSON结构)
直接将硬编码的value值替换为对应变量,注意保留JSON的引号格式,确保最终生成的JSON语法合法。
示例代码:
// 构建动态JSON请求体 String requestBody = "{\n" + " \"facts\": [\n" + " {\"name\": \"total\", \"value\": \"" + totalString + "\"},\n" + " {\"name\": \"success\", \"value\": \"" + successString + "\"},\n" + " {\"name\": \"failed\", \"value\": \"" + failedString + "\"},\n" + " {\"name\": \"skipped\", \"value\": \"" + skippedString + "\"}\n" + " ]\n" + "}"; // 发送POST请求 HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("your-target-api-url")) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(requestBody)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
注意:如果变量中包含双引号、反斜杠等JSON特殊字符,需要手动转义,否则会导致JSON格式错误。
方法2:使用String.format()(更整洁的字符串替换)
将JSON模板中的value位置替换为%s占位符,通过String.format()传入变量,比直接拼接可读性更强。
示例代码:
// 定义带占位符的JSON模板 String jsonTemplate = "{\n" + " \"facts\": [\n" + " {\"name\": \"total\", \"value\": \"%s\"},\n" + " {\"name\": \"success\", \"value\": \"%s\"},\n" + " {\"name\": \"failed\", \"value\": \"%s\"},\n" + " {\"name\": \"skipped\", \"value\": \"%s\"}\n" + " ]\n" + "}"; // 替换占位符生成请求体 String requestBody = String.format(jsonTemplate, totalString, successString, failedString, skippedString); // 后续请求发送代码同方法1
优点:变量位置清晰,代码更整洁;缺点和方法1一致,需手动处理特殊字符转义。
方法3:使用JSON序列化库(推荐,适合复杂场景)
借助Jackson或Gson这类专业JSON库构建JSON对象,自动处理格式校验和特殊字符转义,避免手动拼接的潜在错误,尤其适合复杂JSON结构。
示例(使用Jackson)
先引入Jackson依赖(Maven为例):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
代码实现:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // 构建JSON结构 ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> requestMap = new HashMap<>(); List<Map<String, String>> facts = new ArrayList<>(); facts.add(Map.of("name", "total", "value", totalString)); facts.add(Map.of("name", "success", "value", successString)); facts.add(Map.of("name", "failed", "value", failedString)); facts.add(Map.of("name", "skipped", "value", skippedString)); requestMap.put("facts", facts); // 序列化为JSON字符串 String requestBody = objectMapper.writeValueAsString(requestMap); // 后续请求发送代码同方法1
示例(使用Gson)
引入Gson依赖(Maven为例):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
代码实现:
import com.google.gson.Gson; import java.util.ArrayList; import java.util.List; import java.util.Map; // 构建JSON结构 Gson gson = new Gson(); List<Map<String, String>> facts = new ArrayList<>(); facts.add(Map.of("name", "total", "value", totalString)); facts.add(Map.of("name", "success", "value", successString)); facts.add(Map.of("name", "failed", "value", failedString)); facts.add(Map.of("name", "skipped", "value", skippedString)); Map<String, Object> requestMap = Map.of("facts", facts); // 序列化为JSON字符串 String requestBody = gson.toJson(requestMap); // 后续请求发送代码同方法1
优点:自动处理JSON格式和特殊字符,代码可维护性高,是Java处理JSON的标准方案;缺点是需要引入第三方库,但属于开发中的常规操作。
内容的提问来源于stack exchange,提问作者wheelerlc64
相关产品推荐
相关产品推荐

