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

Java中如何为JSON对象的variables键设置空JSON对象而非字符串值

解决GraphQL请求中JSONObject的variables被转为字符串的问题

问题场景

你需要构造符合要求的GraphQL请求体,期望格式如下:

{
    "variables": {},
    "query": "{\n  uploadQueueSummary {\n    fileName\n    createdBy\n    salesId\n    completedRows\n    totalRows\n    uploadUUID\n    uploadTime\n    status\n    hasErrors\n    uploadType\n    demandType\n    errorRows\n    deletedRows\n    failedRows\n  }\n}"
}

但当前代码中,无论硬编码还是从POJO获取,variables的值都被当作字符串处理:

GraphQLQuery queryAndVars = new GraphQLQuery(); //POJO class
JSONObject requestBody = new JSONObject();
requestBody.put("query",queryAndVars.getQuery());
requestBody.put("variables", "{}");

生成的错误请求体:

{
    "variables": "{}",
    "query": "{\n  uploadQueueSummary {\n    fileName\n    createdBy\n    salesId\n    completedRows\n    totalRows\n    uploadUUID\n    uploadTime\n    status\n    hasErrors\n    uploadType\n    demandType\n    errorRows\n    deletedRows\n    failedRows\n  }\n}"
}

解决方案

核心问题是你传入了字符串类型的"{}",而非JSONObject对象,只需调整传入值的类型即可:

1. 构造空variables对象

直接传入空的JSONObject实例,而非字符串:

GraphQLQuery queryAndVars = new GraphQLQuery();
JSONObject requestBody = new JSONObject();
requestBody.put("query", queryAndVars.getQuery());
// 传入空JSONObject,而非字符串"{}"
requestBody.put("variables", new JSONObject());

2. 构造带参数的variables对象

如果需要传递实际变量参数,先构建对应的JSONObject再传入:

GraphQLQuery queryAndVars = new GraphQLQuery();
JSONObject requestBody = new JSONObject();
requestBody.put("query", queryAndVars.getQuery());

// 构建包含变量的JSONObject
JSONObject variables = new JSONObject();
variables.put("salesId", "S12345");
variables.put("uploadType", "DEMAND");
requestBody.put("variables", variables);

3. 从POJO转换为variables对象

如果你的GraphQLQuery类中包含variables对应的POJO实例,直接用JSONObject包装该实例:

GraphQLQuery queryAndVars = new GraphQLQuery();
JSONObject requestBody = new JSONObject();
requestBody.put("query", queryAndVars.getQuery());

// 假设queryAndVars.getVariables()返回你的POJO对象
requestBody.put("variables", new JSONObject(queryAndVars.getVariables()));

这样生成的请求体中,variables就会被序列化为JSON对象格式,而非字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:03:15