JSON.parse() 相当于 Java 的 mongo 驱动程序 3.x

问题描述 投票:0回答:7
mongo(Java 驱动程序)中的

JSON.parse()
返回 BasicDBList 或 BasicDBObject。

但是,当迁移到 mongo 驱动程序 3.x 时,返回

Document
List<Document>
的新解析方法是什么?

在新驱动程序中,

Document.parse()
仅解析对象,而不解析数组(给定数组时抛出异常)。

对于具有 3.x Java 驱动程序的数组,JSON.parse() 的等效项是什么?

java json mongodb mongodb-java
7个回答
13
投票

解析任何 JSON 并获取

Document
List<Document>
:

的简单技巧
Document.parse("{\"json\":" + json + "}").get("json")

4
投票

使用 mongodb java 驱动程序 3.x 解析 JSON 字符串数据:

解析JSON文档:

使用

Document.parse()
静态方法解析单个 JSON 文档。

Document doc = Document.parse("{\"objA\":{\"foo\":1}}");

解析 JSON 数组:

使用

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.htmlhttp://api.mongodb.org/java/3.2/org/bson/codecs/BsonArrayCodec.html


1
投票

为了完整性,向@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;
}

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] }

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}}]


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());

0
投票

有点晚了,但你可以

BsonArray.parse("[{},{}]");

你可以使用它:

Document doc=new Document()
.append("list", BsonArray.parse("[{},{}]"))

在 mongodb 驱动程序 v5.1 中测试

© www.soinside.com 2019 - 2024. All rights reserved.