Mongo Java Driver 3.6.1:JSON数组转BasicDBList的替代方案
解决MongoDB 3.6.1中解析JSON数组为BasicDBList的问题
我明白你遇到的困扰了——升级到MongoDB 3.6.1后,原来依赖的(BasicDBList) JSON.parse("[]")方法被标记为过时,而BasicDbObject.parse()又只能处理JSON对象结构,没法直接解析数组。下面给你几个可行的解决方案:
方法1:直接转换JSON.parse的结果
JSON.parse()解析数组字符串后返回的其实是ArrayList实例,你可以直接把它的内容添加到新的BasicDBList中:
String jsonArrayStr = "[{\"key1\":\"value1\"}, {\"key2\":\"value2\"}]"; // 解析JSON数组得到List List<?> parsedList = (List<?>) JSON.parse(jsonArrayStr); // 初始化BasicDBList并添加所有元素 BasicDBList dbList = new BasicDBList(); dbList.addAll(parsedList);
方法2:包装数组为临时对象再解析
既然BasicDbObject.parse()只能处理对象,你可以把目标数组包装在一个临时的JSON对象里,解析后再取出数组部分:
String jsonArrayStr = "[{\"name\":\"MongoDB\"}, {\"version\":\"3.6.1\"}]"; // 把数组包装成{"tempList": [你的数组]}格式的JSON字符串 String wrappedJson = String.format("{\"tempList\": %s}", jsonArrayStr); // 解析临时对象 BasicDBObject tempObj = (BasicDBObject) BasicDBObject.parse(wrappedJson); // 取出数组并转换为BasicDBList BasicDBList dbList = (BasicDBList) tempObj.get("tempList");
方法3:使用BsonAPI解析(更贴合新API风格)
如果你想更贴合MongoDB 3.x之后的新API,可以借助BsonArray来解析,再转换为BasicDBList:
import org.bson.BsonArray; import org.bson.codecs.BsonArrayCodec; import org.bson.json.JsonReader; import org.bson.BsonValue; String jsonArrayStr = "[{\"foo\":\"bar\"}, {\"baz\":\"qux\"}]"; // 解析JSON数组为BsonArray BsonArray bsonArray = new BsonArrayCodec().decode(new JsonReader(jsonArrayStr), null); // 转换为BasicDBList BasicDBList dbList = new BasicDBList(); for (BsonValue bsonValue : bsonArray) { dbList.add(BasicDBObject.parse(bsonValue.toJson())); }
额外建议:考虑迁移到新的List类型
需要注意的是,BasicDBList属于MongoDB的旧版Legacy API,官方更推荐使用List<Document>来替代它,如果你没有强依赖BasicDBList的场景,建议迁移到新类型,示例如下:
import org.bson.Document; String jsonArrayStr = "[{\"name\":\"Alice\"}, {\"name\":\"Bob\"}]"; // 同样用包装对象的方式解析 Document tempDoc = Document.parse(String.format("{\"docs\": %s}", jsonArrayStr)); List<Document> docList = tempDoc.getList("docs", Document.class);
这种方式更符合MongoDB 3.x及以后的API设计,也能避免过时API带来的问题。
内容的提问来源于stack exchange,提问作者Ajanthan
相关产品推荐
相关产品推荐

