Skip to content

Commit 37d4a45

Browse files
authored
Use standard UUID representation for JSON generation (#730)
Change the behavior of the following methods: * Document.toJson * BasicDBObject.toJson * BasicDBObject.toString to use standard UUID representation when generating JSON. Prior to this change, an exception would be thrown when the document contains a UUID value. JAVA-4140
1 parent a936752 commit 37d4a45

File tree

4 files changed

+58
-9
lines changed

4 files changed

+58
-9
lines changed

bson/src/main/org/bson/Document.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,18 @@
1616

1717
package org.bson;
1818

19+
import org.bson.codecs.BsonValueCodecProvider;
20+
import org.bson.codecs.Codec;
1921
import org.bson.codecs.Decoder;
2022
import org.bson.codecs.DecoderContext;
2123
import org.bson.codecs.DocumentCodec;
24+
import org.bson.codecs.DocumentCodecProvider;
2225
import org.bson.codecs.Encoder;
2326
import org.bson.codecs.EncoderContext;
27+
import org.bson.codecs.ValueCodecProvider;
2428
import org.bson.codecs.configuration.CodecRegistry;
2529
import org.bson.conversions.Bson;
30+
import org.bson.internal.CodecRegistryHelper;
2631
import org.bson.json.JsonMode;
2732
import org.bson.json.JsonReader;
2833
import org.bson.json.JsonWriter;
@@ -40,8 +45,10 @@
4045
import java.util.Set;
4146

4247
import static java.lang.String.format;
48+
import static java.util.Arrays.asList;
4349
import static org.bson.assertions.Assertions.isTrue;
4450
import static org.bson.assertions.Assertions.notNull;
51+
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
4552

4653
/**
4754
* A representation of a document as a {@code Map}. All iterators will traverse the elements in insertion order, as with {@code
@@ -51,6 +58,12 @@
5158
* @since 3.0.0
5259
*/
5360
public class Document implements Map<String, Object>, Serializable, Bson {
61+
private static final Codec<Document> DEFAULT_CODEC =
62+
CodecRegistryHelper.createRegistry(
63+
fromProviders(asList(new ValueCodecProvider(), new BsonValueCodecProvider(), new DocumentCodecProvider())),
64+
UuidRepresentation.STANDARD)
65+
.get(Document.class);
66+
5467
private static final long serialVersionUID = 6297731997167536582L;
5568

5669
private final LinkedHashMap<String, Object> documentAsMap;
@@ -92,7 +105,7 @@ public Document(final Map<String, Object> map) {
92105
* @mongodb.driver.manual reference/mongodb-extended-json/ MongoDB Extended JSON
93106
*/
94107
public static Document parse(final String json) {
95-
return parse(json, new DocumentCodec());
108+
return parse(json, DEFAULT_CODEC);
96109
}
97110

98111
/**
@@ -410,7 +423,7 @@ public String toJson() {
410423
* @throws org.bson.codecs.configuration.CodecConfigurationException if the document contains types not in the default registry
411424
*/
412425
public String toJson(final JsonWriterSettings writerSettings) {
413-
return toJson(writerSettings, new DocumentCodec());
426+
return toJson(writerSettings, DEFAULT_CODEC);
414427
}
415428

416429
/**

bson/src/test/unit/org/bson/DocumentTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Arrays;
3434
import java.util.Collections;
3535
import java.util.List;
36+
import java.util.UUID;
3637

3738
import static java.util.Arrays.asList;
3839
import static org.bson.codecs.configuration.CodecRegistries.fromCodecs;
@@ -144,6 +145,15 @@ public void toBsonDocumentShouldCreateBsonDocument() {
144145
assertEquals(expected, document.toBsonDocument());
145146
}
146147

148+
@Test
149+
public void toJsonShouldRenderUuidAsStandard() {
150+
UUID uuid = UUID.randomUUID();
151+
Document doc = new Document("_id", uuid);
152+
153+
String json = doc.toJson();
154+
assertEquals(new BsonDocument("_id", new BsonBinary(uuid)), BsonDocument.parse(json));
155+
}
156+
147157
public class Name {
148158
private final String name;
149159

driver-core/src/main/com/mongodb/BasicDBObject.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.bson.BsonDocument;
2323
import org.bson.BsonDocumentWrapper;
2424
import org.bson.UuidRepresentation;
25+
import org.bson.codecs.Codec;
2526
import org.bson.codecs.Decoder;
2627
import org.bson.codecs.DecoderContext;
2728
import org.bson.codecs.Encoder;
@@ -58,6 +59,12 @@
5859
public class BasicDBObject extends BasicBSONObject implements DBObject, Bson {
5960
private static final long serialVersionUID = -4415279469780082174L;
6061

62+
private static final Codec<BasicDBObject> DEFAULT_CODEC =
63+
CodecRegistryHelper.createRegistry(
64+
DBObjectCodec.getDefaultRegistry(),
65+
UuidRepresentation.STANDARD)
66+
.get(BasicDBObject.class);
67+
6168
private boolean isPartialObject;
6269

6370
/**
@@ -69,7 +76,7 @@ public class BasicDBObject extends BasicBSONObject implements DBObject, Bson {
6976
* @mongodb.driver.manual reference/mongodb-extended-json/ MongoDB Extended JSON
7077
*/
7178
public static BasicDBObject parse(final String json) {
72-
return parse(json, DBObjectCodec.getDefaultRegistry().get(BasicDBObject.class));
79+
return parse(json, DEFAULT_CODEC);
7380
}
7481

7582
/**
@@ -167,7 +174,7 @@ public String toJson() {
167174
* @throws org.bson.codecs.configuration.CodecConfigurationException if the document contains types not in the default registry
168175
*/
169176
public String toJson(final JsonWriterSettings writerSettings) {
170-
return toJson(writerSettings, DBObjectCodec.getDefaultRegistry().get(BasicDBObject.class));
177+
return toJson(writerSettings, DEFAULT_CODEC);
171178
}
172179

173180
/**
@@ -227,10 +234,9 @@ public int hashCode() {
227234
* of this class because currently this method is only used for equality and hash code, and is not passed to any other parts of the
228235
* library.
229236
*/
230-
private static byte[] toBson(final DBObject dbObject) {
237+
private static byte[] toBson(final BasicDBObject dbObject) {
231238
OutputBuffer outputBuffer = new BasicOutputBuffer();
232-
CodecRegistryHelper.createRegistry(DBObjectCodec.getDefaultRegistry(), UuidRepresentation.STANDARD)
233-
.get(DBObject.class).encode(new BsonBinaryWriter(outputBuffer), dbObject, EncoderContext.builder().build());
239+
DEFAULT_CODEC.encode(new BsonBinaryWriter(outputBuffer), dbObject, EncoderContext.builder().build());
234240
return outputBuffer.toByteArray();
235241
}
236242

@@ -302,7 +308,7 @@ private static Map<String, Object> canonicalizeMap(final Map<String, Object> fro
302308
return canonicalized;
303309
}
304310

305-
private static DBObject canonicalizeBSONObject(final BSONObject from) {
311+
private static BasicDBObject canonicalizeBSONObject(final BSONObject from) {
306312
BasicDBObject canonicalized = new BasicDBObject();
307313
TreeSet<String> keysInOrder = new TreeSet<String>(from.keySet());
308314
for (String key : keysInOrder) {

driver-core/src/test/unit/com/mongodb/BasicDBObjectTest.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import org.bson.BSONObject;
2020
import org.bson.BasicBSONObject;
21+
import org.bson.BsonBinary;
22+
import org.bson.BsonDocument;
2123
import org.bson.codecs.Codec;
2224
import org.bson.json.JsonMode;
2325
import org.bson.json.JsonWriterSettings;
@@ -34,9 +36,9 @@
3436

3537
import static java.util.Arrays.asList;
3638
import static org.hamcrest.CoreMatchers.not;
39+
import static org.hamcrest.MatcherAssert.assertThat;
3740
import static org.junit.Assert.assertEquals;
3841
import static org.junit.Assert.assertFalse;
39-
import static org.hamcrest.MatcherAssert.assertThat;
4042
import static org.junit.Assert.assertTrue;
4143

4244
@SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
@@ -78,6 +80,24 @@ public void testToJson() {
7880
document.toJson(JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build(), DECODER));
7981
}
8082

83+
@Test
84+
public void toJsonShouldRenderUuidAsStandard() {
85+
UUID uuid = UUID.randomUUID();
86+
BasicDBObject doc = new BasicDBObject("_id", uuid);
87+
88+
String json = doc.toJson();
89+
assertEquals(new BsonDocument("_id", new BsonBinary(uuid)), BsonDocument.parse(json));
90+
}
91+
92+
@Test
93+
public void toStringShouldRenderUuidAsStandard() {
94+
UUID uuid = UUID.randomUUID();
95+
BasicDBObject doc = new BasicDBObject("_id", uuid);
96+
97+
String json = doc.toString();
98+
assertEquals(new BsonDocument("_id", new BsonBinary(uuid)), BsonDocument.parse(json));
99+
}
100+
81101
@Test
82102
public void testGetDate() {
83103
final Date date = new Date();

0 commit comments

Comments
 (0)