如何通过BasicDBObject从含列表的JSON字符串提取counts键值对
如何从解析后的MongoDB BasicDBList中提取键值对?
嘿,这事儿一点都不复杂!你已经完成了解析JSON的第一步,接下来只要按步骤遍历列表、逐个处理每个子对象就行,我给你说的明明白白:
步骤1:获取并转换BasicDBList
doc.get("counts")返回的是Object类型,所以首先得把它强制转换成BasicDBList,这样才能正常进行遍历操作:
BasicDBList countsList = (BasicDBList) doc.get("counts");
步骤2:遍历列表中的每个DBObject
列表里的每一项都是一个DBObject(准确说是BasicDBObject,它是DBObject的实现类),我们可以用增强for循环逐个取出:
for (Object item : countsList) { DBObject countObj = (DBObject) item; // 这里处理每个countObj的键值对 }
步骤3:提取键值对的两种常用方式
因为BasicDBObject实现了Map<String, Object>接口,所以所有Map的遍历方法都能用,这里给你两种最常用的:
方式1:遍历键集合(keySet)
先拿到所有键,再根据键获取对应的值:
for (String key : countObj.keySet()) { Object value = countObj.get(key); // 这里可以打印或者存储键值对,比如: System.out.printf("Key: %s, Value: %s%n", key, value); }
方式2:直接遍历键值对条目(entrySet)
这种方式更直接,一次就能拿到键和值:
for (Map.Entry<String, Object> entry : countObj.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // 同样可以做后续处理: System.out.printf("Key: %s, Value: %s%n", key, value); }
完整示例代码
把所有步骤整合起来,就是这样的完整可运行代码:
import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import java.util.Map; public class MongoCountsParser { public static void main(String[] args) { String jsonString = "{ \"counts\":[ {\"foo827138\": 123124, \"bar2918\":312312, \"something_else321-313\":2321321}, {\"foo1231412\": 4321, \"bar1231515\":123, \"something_else3012931\":7282}, {\"foo1210820\": 1234, \"bar10293810\":3112, \"something_else12094\":1321} ] }"; // 解析JSON为DBObject DBObject doc = BasicDBObject.parse(jsonString); // 获取counts列表 BasicDBList countsList = (BasicDBList) doc.get("counts"); // 遍历每个子对象 for (Object item : countsList) { DBObject countObj = (DBObject) item; System.out.println("===== 处理下一个对象 ====="); // 方式1:keySet遍历 System.out.println("--- 方式1 输出 ---"); for (String key : countObj.keySet()) { System.out.printf("Key: %s, Value: %s%n", key, countObj.get(key)); } // 方式2:entrySet遍历 System.out.println("--- 方式2 输出 ---"); for (Map.Entry<String, Object> entry : countObj.entrySet()) { System.out.printf("Key: %s, Value: %s%n", entry.getKey(), entry.getValue()); } } } }
小提示
如果你确定子对象的类型是BasicDBObject,也可以直接把item强转为BasicDBObject,效果完全一样——毕竟BasicDBObject既是DBObject的子类,也是Map的实现类。
内容的提问来源于stack exchange,提问作者Augusto Dias
相关产品推荐
相关产品推荐

