JSON.parse()
(Java驱动程序)返回BasicDBList或BasicDBObject。
但是,在迁移到mongo驱动程序3.x时,返回Document
或List<Document>
的新解析方法是什么?
在新驱动程序中,Document.parse()
仅解析对象,而不解析数组(在给定数组时抛出异常)。
对于具有3.x Java驱动程序的数组,JSON.parse()的等价物是什么?
答案 0 :(得分:5)
解析任何JSON并获取Document
或List<Document>
的简单技巧:
Document.parse("{\"json\":" + json + "}").get("json")
答案 1 :(得分:2)
使用 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
答案 2 :(得分:0)
这个怎么样:
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] }
答案 3 :(得分:0)
你是对的,没有简单的等价物。
如果您使用行分隔的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}}]
答案 4 :(得分:0)
对我来说最简单的等价是使用任何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());
答案 5 :(得分:0)
为完整性起见,在@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;
}