如何在JsonObject中正确添加数组类型字段,避免数组被转义为字符串
问题根因与修复方案
错误根源
你当前的输出不符合预期,核心原因完全是类型识别错误导致的:
- 你定义的
mUserArray虽然内容看起来像数组,但实际类型是String,本质是一段被序列化的JSON格式文本,字符串内部的双引号已经被做了转义处理。 - 不管是手动new JsonArray后把整串文本当元素加进去,还是用
JsonPrimitive封装后赋值,或是直接通过addProperty给字段传这个字符串值,JSON序列化工具都会把这段内容识别为普通字符串值,不会自动解析字符串内部的数组结构。 - 最终输出里出现的
"usernames":"[\"user1\", \"user2\"]",就是序列化工具对普通字符串值里的双引号做自动转义的结果,和要求的数组类型字段完全不匹配。
正确实现方式
场景1:可调整传参逻辑(推荐)
从Fragment传参环节就不要把用户名单序列化成字符串再传输,直接传递原生String[]或List<String>类型的用户列表,构造JSON时逐个填充数组元素即可:
// 从Fragment参数中直接获取真实的用户名单列表 List<String> usernameList = getNavArgs().getUsernames(); JsonArray userArray = new JsonArray(); // 把每个用户名作为独立元素加入数组 for (String username : usernameList) { userArray.add(username); } JsonObject jo = new JsonObject(); jo.addProperty("type", "value"); jo.add("usernames", userArray);
场景2:无法调整传参,仅能拿到字符串格式的数组文本
不需要手动拆分字符串拼接数组,直接通过JSON解析器把现有字符串解析为原生JsonArray节点,再赋值给对应字段即可:
// 现有拿到的字符串值,内容为 ["user1", "user2"] String mUserArray = "[\"user1\", \"user2\"]"; // 直接将字符串解析为JSON数组节点,无需手动处理转义符 JsonArray parsedUserArray = JsonParser.parseString(mUserArray).getAsJsonArray(); JsonObject jo = new JsonObject(); jo.addProperty("type", "value"); jo.add("usernames", parsedUserArray);
避坑提醒:
addProperty方法仅适合给字段赋值字符串、数字、布尔这类基础类型值,赋值JSON结构类型(数组、嵌套对象)时,必须传入对应的JsonObject/JsonArray类型节点,不要直接传序列化后的字符串文本,否则必然会生成转义后的字符串字段。
内容的提问来源于stack exchange,提问作者sejn
相关产品推荐
相关产品推荐

