JSON.parse()
返回 BasicDBList 或 BasicDBObject。
但是,当迁移到 mongo 驱动程序 3.x 时,返回
Document
或 List<Document>
的新解析方法是什么?
在新驱动程序中,
Document.parse()
仅解析对象,而不解析数组(给定数组时抛出异常)。
对于具有 3.x Java 驱动程序的数组,JSON.parse() 的等效项是什么?
解析任何 JSON 并获取
Document
或 List<Document>
: 的简单技巧
Document.parse("{\"json\":" + json + "}").get("json")
使用 mongodb java 驱动程序 3.x 解析 JSON 字符串数据:
使用
Document.parse()
静态方法解析单个 JSON 文档。
Document doc = Document.parse("{\"objA\":{\"foo\":1}}");
使用
BsonArrayCodec
的实例来解码 JsonReader
。
例如:
final String JSON_DATA
= "[{\"objA\":{\"foo\":1}},"
+ "{\"objB\":{\"bar\":2}}]";
final CodecRegistry codecRegistry = CodecRegistries.fromProviders(asList(new ValueCodecProvider(),
new BsonValueCodecProvider(),
new DocumentCodecProvider()));
JsonReader reader = new JsonReader(JSON_DATA);
BsonArrayCodec arrayReader = new BsonArrayCodec(codecRegistry);
BsonArray docArray = arrayReader.decode(reader, DecoderContext.builder().build());
for (BsonValue doc : docArray.getValues()) {
System.out.println(doc);
}
参考:http://api.mongodb.org/java/3.2/org/bson/json/JsonReader.html, http://api.mongodb.org/java/3.2/org/bson/codecs/BsonArrayCodec.html
为了完整性,向@Oleg Nitz 答案添加了演员表。
Object object = Document.parse("{\"json\":" + jsonData.getJson() + "}").get("json");
if (object instanceof ArrayList) {
documents = (ArrayList<Document>) object;
} else (object instanceof Document) {
document = (Document) object;
}
这个怎么样:
Document doc = new Document("array", JSON.parse("[ 100, 500, 300, 200, 400 ]", new JSONCallback()));
System.out.println(doc.toJson()); //prints { "array" : [100, 500, 300, 200, 400] }
你说得对,没有简单的等价物。
如果您使用行分隔的 JSON 文档而不是 JSON 数组,它会变得相当简单:
List<Document> getDocumentsFromLineDelimitedJson(final String lineDelimitedJson) {
BufferedReader stringReader = new BufferedReader(
new StringReader(lineDelimitedJson));
List<Document> documents = new ArrayList<>();
String json;
try {
while ((json = stringReader.readLine()) != null) {
documents.add(Document.parse(json));
}
} catch (IOException e) {
// ignore, can't happen with a StringReader
}
return documents;
}
例如这个电话
System.out.println(getDocumentsFromLineDelimitedJson("{a : 1}\n{a : 2}\n{a : 3}"));
将打印:
[文档{{a=1}}、文档{{a=2}}、文档{{a=3}}]
对我来说最简单的等效方法是使用任何 json 库将 json 转换为 POJO。以下是使用 Jackson 的示例:
String input = "[{\"objA\":{\"foo\":1}},{\"objB\":{\"bar\":2}}]";
ObjectMapper mapper = new ObjectMapper();
List<Document> output = (List<Document>) mapper.readValue(input, List.class)
.stream().map(listItem -> new Document((LinkedHashMap)listItem))
.collect(Collectors.toList());
有点晚了,但你可以
BsonArray.parse("[{},{}]");
你可以使用它:
Document doc=new Document()
.append("list", BsonArray.parse("[{},{}]"))
在 mongodb 驱动程序 v5.1 中测试