使用Rest Assured将String数组插入JSONArray时的异常问题排查
解决Rest Assured中JSONArray插入字符串数组的异常问题
我完全懂你碰到的麻烦——明明tokenUUIDs数组能拿到正确的字符串值,结果把它放进JSONArray后却输出了[[Ljava.lang.String;@6fc0bbc6这种像对象内存地址的奇怪内容。这问题其实很好解决,我来给你拆解下:
问题根源
你现在是直接把整个String[]数组对象传给了JSONArray.add()方法,而这个方法会把传入的数组当作单个对象来存储,序列化时就会输出数组对象的默认toString()结果,也就是你看到的那种格式,而不是把数组里的每个字符串元素拆出来放进JSON数组里。
两种修复方案
方案1:遍历数组逐个添加元素
最直观的方式就是循环遍历tokenUUIDs数组,把每个字符串单独加入JSONArray:
JSONArray ArraytokenUUIDs = new JSONArray(); // 遍历字符串数组,逐个添加到JSONArray中 for (String token : tokenUUIDs) { ArraytokenUUIDs.add(token); }
方案2:直接用数组初始化JSONArray
如果你使用的是org.json库(从你的代码写法来看应该是这个),可以直接利用JSONArray的构造函数,传入字符串数组就能自动完成元素拆分:
// 直接用字符串数组初始化JSONArray,一步到位 JSONArray ArraytokenUUIDs = new JSONArray(tokenUUIDs);
修改后的完整代码片段
把你原来的JSONArray初始化部分替换成上面任意一种方案就行,比如:
public static void releaseTokens(String[] tokenUUIDs ) { try{ RequestSpecification request = RestAssured.given(); request.header("Content-Type", "application/json"); JSONObject releaseTokens = new JSONObject(); releaseTokens.put("partnerCode", commonOps.partnerCode); releaseTokens.put("apiAccessToken",commonOps.openAccessToken); releaseTokens.put("sessionUUID",SessionUUID); releaseTokens.put("taskUUID","TaskUUID"); // 替换成方案2的写法,简洁高效 JSONArray ArraytokenUUIDs = new JSONArray(tokenUUIDs); releaseTokens.put("tokenUUIDs", ArraytokenUUIDs); request.body(releaseTokens.toJSONString()); Response response = request.post((getData("APIenv") + "/api/sessions/releaseTokens.php")); // 后续断言和日志代码保持不变...
这样修改后,生成的JSON里tokenUUIDs字段就会变成正常的字符串数组格式,比如["uuid1", "uuid2", "uuid3"],不会再出现那个奇怪的对象标识了。
内容的提问来源于stack exchange,提问作者libi
相关产品推荐
相关产品推荐

