Эквивалент JSON.parse() в драйвере монго 3.x для Java

JSON.parse() from mongo (драйвер Java) возвращает либо BasicDBList, либо BasicDBObject.

Тем не менее, при переходе на драйвер Монго 3.x, что новый метод синтаксического анализа, который возвращает либо Document или же List<Document>?

В новом драйвере Document.parse() анализирует только объект, а не массив (генерирует исключение при получении массива).

Что эквивалентно JSON.parse() для массивов с драйверами Java 3.x?

5 ответов

Простой трюк, чтобы разобрать любой JSON и получить либо Document или же List<Document>:

Document.parse("{\"json\":" + json + "}").get("json")

Чтобы проанализировать строковые данные JSON с помощью драйвера mongodb java 3.x:

Разбор 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.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;
}

Для меня самый простой эквивалент - использовать любую библиотеку json для преобразования json в POJO. Ниже приведен пример использования Джексона:

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

Вы правы, что нет простого эквивалента.

Если вы используете 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}}]

Как насчет этого:

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] }
Другие вопросы по тегам