如何使用GSON筛选JSON中LANGUAGE_ID为AR的元素?
用GSON筛选包含指定LANGUAGE_ID的JSON元素
我来帮你完成这个筛选功能,先明确你的JSON结构层级,这样能准确遍历到目标字段:
- 根对象 →
"FDN"数组(每个元素是一条新闻条目) - 每个FDN条目 →
"CL"数组(每个CL元素存储键值对集合) - 每个CL元素 →
"K"数组(存放FID和VAL的键值对)
你的现有代码只获取了CL数组的首个元素,没有完成全层级遍历和筛选逻辑。下面是完整的实现代码,附带详细注释:
import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.util.ArrayList; import java.util.List; public class JsonFilterExample { public static void main(String[] args) { // 假设convertedObject是已经解析好的根JsonObject JsonObject rootObject = (JsonObject) convertedObject; JsonArray fdnArray = rootObject.getAsJsonArray("FDN"); // 存储符合条件的FDN元素 List<JsonObject> filteredFdnElements = new ArrayList<>(); // 遍历FDN数组中的每个条目 for (JsonElement fdnElement : fdnArray) { if (!fdnElement.isJsonObject()) { continue; // 跳过非对象类型的元素 } JsonObject fdnObj = fdnElement.getAsJsonObject(); // 获取CL数组 JsonElement clElement = fdnObj.get("CL"); if (clElement == null || !clElement.isJsonArray()) { continue; // 如果CL不存在或不是数组,直接跳过 } JsonArray clArray = clElement.getAsJsonArray(); // 标记当前FDN条目是否符合筛选条件 boolean isMatch = false; // 遍历CL数组中的每个元素 for (JsonElement clItem : clArray) { if (!clItem.isJsonObject()) { continue; } JsonObject clObj = clItem.getAsJsonObject(); // 获取K数组 JsonElement kElement = clObj.get("K"); if (kElement == null || !kElement.isJsonArray()) { continue; } JsonArray kArray = kElement.getAsJsonArray(); // 遍历K数组,检查是否存在目标键值对 for (JsonElement kItem : kArray) { if (!kItem.isJsonObject()) { continue; } JsonObject kObj = kItem.getAsJsonObject(); String fid = kObj.get("FID").getAsString(); String val = kObj.get("VAL").getAsString(); // 匹配目标条件:FID为"LANGUAGE_ID"且VAL为"AR" if ("LANGUAGE_ID".equals(fid) && "AR".equals(val)) { isMatch = true; break; // 找到匹配,跳出K数组循环 } } if (isMatch) { break; // 找到匹配,跳出CL数组循环 } } // 如果当前FDN条目符合条件,加入结果列表 if (isMatch) { filteredFdnElements.add(fdnObj); } } // 输出筛选结果 System.out.println("筛选出的AR语言条目数量:" + filteredFdnElements.size()); for (JsonObject obj : filteredFdnElements) { System.out.println(obj.toString()); } } }
代码说明:
- 全层级遍历:从根对象开始,依次遍历
FDN→CL→K数组,确保不会遗漏任何嵌套层级的元素。 - 异常防护:每一步都加入了类型判断和空值检查,避免出现
NullPointerException或类型转换异常。 - 高效匹配:一旦在某个FDN条目中找到符合条件的键值对,就立即跳出内层循环,提升遍历效率。
- 结果收集:将所有符合条件的FDN条目存入列表,方便后续的业务处理或输出。
预期输出:
运行代码后,你会得到所有包含阿拉伯语(AR)的新闻条目,示例如下:
{"OT":1,"CL":[{"K":[{"FID":348,"VAL":"20822549"},{"FID":"LANGUAGE_ID","VAL":"AR"}]}],"NK":null,"SS":0,"ITID":"NEWS","TSID":44969008,"DT":"20180504123302007"} {"OT":1,"CL":[{"K":[{"FID":348,"VAL":"20822551"},{"FID":"LANGUAGE_ID","VAL":"AR"}]}],"NK":null,"SS":0,"ITID":"NEWS","TSID":44969010,"DT":"20180504123302008"} {"OT":1,"CL":[{"K":[{"FID":348,"VAL":"20822573"},{"FID":"LANGUAGE_ID","VAL":"AR"}]}],"NK":null,"SS":0,"ITID":"NEWS","TSID":44969065,"DT":"20180504080929368"} {"OT":0,"CL":[{"K":[{"FID":348,"VAL":"20822573"},{"FID":"LANGUAGE_ID","VAL":"AR"}]}],"NK":null,"SS":0,"ITID":"NEWS","TSID":44969066,"DT":"20180504080929369"} {"OT":1,"CL":[{"K":[{"FID":348,"VAL":"20822574"},{"FID":"LANGUAGE_ID","VAL":"AR"}]}],"NK":null,"SS":0,"ITID":"NEWS","TSID":44969067,"DT":"20180504082130104"}
内容的提问来源于stack exchange,提问作者Nomesh DeSilva
相关产品推荐
相关产品推荐

