web-dev-qa-db-fra.com

Création d'un objet BSON à partir d'une chaîne JSON

J'ai une application Java qui prend les données d'une application externe. Les JSON entrants sont dans des chaînes. Je voudrais analyser ces chaînes et créer des objets BSON.

Malheureusement, je ne trouve pas d'API pour cela dans l'implémentation BSON de Java.

Dois-je utiliser un analyseur externe pour cela comme GSON?

44
Maciek Sawicki

La façon la plus simple semble être d'utiliser une bibliothèque JSON pour analyser les chaînes JSON dans un Map puis d'utiliser la méthode putAll pour mettre ces valeurs dans un BSONObject.

Cette réponse montre comment utiliser Jackson pour analyser une chaîne JSON dans un Map.

12
Hank Gay

MongoDB officiel Java est livré avec des méthodes utilitaires pour analyser JSON en BSON et sérialiser BSON en JSON.

import com.mongodb.DBObject;
import com.mongodb.util.JSON;

DBObject dbObj = ... ;
String json = JSON.serialize( dbObj );
DBObject bson = ( DBObject ) JSON.parse( json );

Le pilote peut être trouvé ici: https://mongodb.github.io/mongo-Java-driver/

39
eskatos

... Et, depuis 3.0.0, vous pouvez:

import org.bson.Document;

final Document doc = new Document("myKey", "myValue");
final String jsonString = doc.toJson();
final Document doc = Document.parse(jsonString);

Documents officiels:

38
yair

Pour convertir une chaîne json en bson, procédez comme suit:

import org.bson.BasicBSONEncoder;
import org.bson.BSONObject;

BSONObject bson = (BSONObject)com.mongodb.util.JSON.parse(string_json);
BasicBSONEncoder encoder = new BasicBSONEncoder();
byte[] bson_byte = encoder.encode(bson);

Pour convertir un bson en json, procédez comme suit:

import org.bson.BasicBSONDecoder;
import org.bson.BSONObject;

BasicBSONDecoder decoder = new BasicBSONDecoder();
BSONObject bsonObject = decoder.readObject(out);
String json_string = bsonObject.toString();
10
Leticia Santos

Utilisez Document.parse(String json) à partir de org.bson.Document. Il renvoie Document objet qui est de type Bson.

5
ultimatex

Vous pourriez être intéressé par le projet bson4jackson , qui vous permet d'utiliser la liaison de données Jackson pour travailler avec BSON (créer des POJO à partir de BSON, écrire en BSON) - d'autant plus que Jackson travaille également avec JSON. Ainsi, il permettra la conversion comme vous le mentionnez, utilisez simplement différents instanstaces ObjectMapper (l'un qui fonctionne avec JSON, l'autre avec BSON).

Avec Jackson, vous pouvez soit travailler avec des POJO complets (déclarer la structure que vous voulez), soit avec de simples cartes, listes, etc. Il vous suffit de déclarer à quoi taper pour vous lier lors de la lecture des données (lors de l'écriture, le type est défini par l'objet que vous passez).

3
StaxMan

Je suggérerais d'utiliser les méthodes toJson () et parse (String) du BasicDBObject, car la classe d'utilitaires JSON a été @Depricated.

import com.mongodb.BasicDBObject;

public static BasicDBObject makeBsonObject(String json) {
    return BasicDBObject.parse(json);
}

public static String makeJsonObject(BasicDBObject dbObj) {
    return dbObj.toJson();
}
2
user2023448

Vous trouverez la réponse à votre question dans le code source de https://github.com/mongodb/mongo/blob/master/src/mongo/db/jsobj.cpp Qui a le BSON en conversion JSON.

Fondamentalement, des trucs comme

  • ObjectId("XXX") -> { "$oid" : "XXX" }
  • /XXX/gi -> { "$regex" : "XXX", "$options" : "gi" }

etc...

2

Je ne suis pas sûr de Java mais le pilote mongoDB CPP a un type de fonction

BSONObj fromjson (chaîne)

qui renvoie un BSONObj en fonction de la chaîne passée. Il devrait y avoir une même fonction dans Java aussi.

1
mayank_gupta