
本文详解如何使用 org.json 库正确解析 jsonarray,遍历其中每个 jsonobject,并安全提取 candidate_id、cluster_id、count 和 utterance 字段,避免字符串误匹配问题。
在 Java 中处理 JSON 数据时,切忌将 JSON 数组直接转为 String 列表后用 contains() 或子串匹配方式提取字段——这极易因格式换行、空格、引号嵌套或字段值含关键词(如 "utterance":"candidate_id is valid")导致误判或解析失败。正确做法是:利用标准 JSON 解析库,将原始 JSON 字符串反序列化为 JSONArray,再通过索引或迭代器获取每个 JSONObject,最后调用 getString() 等类型安全方法提取字段。
以下是完整、健壮的实现步骤(基于 org.json 库):
✅ 正确解析与提取示例代码
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class JsonArrayParser {
public static void main(String[] args) {
// 原始 JSON 字符串(注意:必须是合法的 JSON 数组格式,此处已补全末尾 ])
String jsonStr = "[{" +
"\"candidate_id\":\"agent_4\"," +
"\"cluster_ID\":\"To_Be_Added\"," +
"\"count\":\"2\"," +
"\"utterance\":\"Can I text you a confirmation code on the line ending in 1544\"" +
"},{" +
"\"candidate_id\":\"agent_11\"," +
"\"cluster_ID\":\"To_Be_Added\"," +
"\"count\":\"2\"," +
"\"utterance\":\"Can I text you a confirmation code on the line ending in 3544\"" +
"},{" +
"\"candidate_id\":\"agent_16\"," +
"\"cluster_ID\":\"To_Be_Added\"," +
"\"count\":\"63\"," +
"\"utterance\":\"Hello Janet can you confirm your phone number?\"" +
"}]";
JSONArray jsonArray = new JSONArray(jsonStr);
List extractedObjects = new ArrayList<>();
// 遍历 JSONArray,逐个提取 JSONObject
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = jsonArray.getJSONObject(i);
// 安全提取字段(自动处理引号、转义、类型转换)
String candidateId = obj.optString("candidate_id", ""); // 推荐:带默认值防 NullPointerException
String clusterId = obj.optString("cluster_ID", "");
String count = obj.optString("count", "");
String utterance = obj.optString("utterance", "");
// 可选:构建新 JSONObject(如需结构化输出或后续处理)
JSONObject recommendation = new JSONObject();
recommendation.put("candidate_id", candidateId);
recommendation.put("cluster_ID", clusterId);
recommendation.put("count", count);
recommendation.put("utterance", utterance);
extractedObjects.add(recommendation);
// 日志输出(生产环境建议使用 SLF4J + 参数化日志)
System.out.println("Recommendation " + (i + 1) + ": " + recommendation.toString(2));
}
// 最终聚合输出(符合题目要求的“Recommendation: { {...}, {...} }”格式)
System.out.println("\nFinal Output:");
System.out.print("Recommendation :{");
for (int i = 0; i < extractedObjects.size(); i++) {
if (i > 0) System.out.print(", ");
System.out.print(extractedObjects.get(i).toString(2).replace("\n", "").replace(" ", " "));
}
System.out.println("}");
}
} ⚠️ 关键注意事项
-
依赖声明:确保 pom.xml 中已引入最新稳定版 org.json:
org.json json 20240303 - JSON 格式校验:输入字符串必须是合法的 JSON 数组(以 [ 开头、] 结尾,对象间用英文逗号分隔)。题目中原始字符串缺少结尾 ],实际使用前需校验或修复。
- 空值防护:始终使用 optString(key, defaultValue) 而非 getString(key),避免因字段缺失导致 JSONException。
- 性能提示:若数据量极大(如万级对象),可考虑流式解析(如 Jackson 的 JsonParser),但对常规业务场景,org.json 简洁可靠。
-
不推荐方案警示:
❌ s.contains("candidate_id") + exampleList.get(j) —— 字符串模糊匹配不可靠,且 exampleList 未定义,逻辑断裂;
❌ 手动拼接 JSON 字符串 —— 易出格式错误、XSS 风险、无转义保障。
✅ 总结
解析 JSON 的核心原则是:信任结构,而非文本。将 JSON 字符串交由专业解析器(如 org.json、Jackson 或 Gson)处理,利用其提供的类型安全 API(getJSONObject()、optString() 等)精准访问嵌套数据,才能写出可维护、可扩展、健壮的 Java JSON 处理代码。










