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?
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
.
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/
... 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:
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();
Utilisez Document.parse(String json)
à partir de org.bson.Document
. Il renvoie Document
objet qui est de type Bson
.
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).
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();
}
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...
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.