@@ -25,12 +25,24 @@ import kotlinx.serialization.descriptors.SerialKind
25
25
import kotlinx.serialization.descriptors.StructureKind
26
26
import kotlinx.serialization.encoding.AbstractEncoder
27
27
import kotlinx.serialization.encoding.CompositeEncoder
28
+ import kotlinx.serialization.json.Json
29
+ import kotlinx.serialization.json.JsonArray
30
+ import kotlinx.serialization.json.JsonElement
31
+ import kotlinx.serialization.json.JsonEncoder
32
+ import kotlinx.serialization.json.JsonNull
33
+ import kotlinx.serialization.json.JsonObject
34
+ import kotlinx.serialization.json.JsonPrimitive
35
+ import kotlinx.serialization.json.double
36
+ import kotlinx.serialization.json.int
37
+ import kotlinx.serialization.json.long
28
38
import kotlinx.serialization.modules.SerializersModule
29
39
import org.bson.BsonValue
30
40
import org.bson.BsonWriter
31
41
import org.bson.codecs.BsonValueCodec
32
42
import org.bson.codecs.EncoderContext
43
+ import org.bson.types.Decimal128
33
44
import org.bson.types.ObjectId
45
+ import java.math.BigDecimal
34
46
35
47
/* *
36
48
* The BsonEncoder interface
@@ -62,17 +74,29 @@ internal class DefaultBsonEncoder(
62
74
private val writer : BsonWriter ,
63
75
override val serializersModule : SerializersModule ,
64
76
private val configuration : BsonConfiguration
65
- ) : BsonEncoder, AbstractEncoder() {
77
+ ) : BsonEncoder, JsonEncoder, AbstractEncoder() {
66
78
67
79
companion object {
68
80
val validKeyKinds = setOf (PrimitiveKind .STRING , PrimitiveKind .CHAR , SerialKind .ENUM )
69
81
val bsonValueCodec = BsonValueCodec ()
82
+ private val DOUBLE_MIN_VALUE = BigDecimal .valueOf(Double .MIN_VALUE )
83
+ private val DOUBLE_MAX_VALUE = BigDecimal .valueOf(Double .MAX_VALUE )
84
+ private val INT_MIN_VALUE = BigDecimal .valueOf(Int .MIN_VALUE .toLong())
85
+ private val INT_MAX_VALUE = BigDecimal .valueOf(Int .MAX_VALUE .toLong())
86
+ private val LONG_MIN_VALUE = BigDecimal .valueOf(Long .MIN_VALUE )
87
+ private val LONG_MAX_VALUE = BigDecimal .valueOf(Long .MAX_VALUE )
70
88
}
71
89
72
90
private var isPolymorphic = false
73
91
private var state = STATE .VALUE
74
92
private var mapState = MapState ()
75
93
private var deferredElementName: String? = null
94
+ override val json = Json {
95
+ explicitNulls = configuration.explicitNulls
96
+ encodeDefaults = configuration.encodeDefaults
97
+ classDiscriminator = configuration.classDiscriminator
98
+ serializersModule = this @DefaultBsonEncoder.serializersModule
99
+ }
76
100
77
101
override fun shouldEncodeElementDefault (descriptor : SerialDescriptor , index : Int ): Boolean =
78
102
configuration.encodeDefaults
@@ -143,10 +167,10 @@ internal class DefaultBsonEncoder(
143
167
deferredElementName?.let {
144
168
if (value != null || configuration.explicitNulls) {
145
169
encodeName(it)
146
- super .encodeNullableSerializableValue(serializer, value)
170
+ super < AbstractEncoder > .encodeNullableSerializableValue(serializer, value)
147
171
}
148
172
}
149
- ? : super .encodeNullableSerializableValue(serializer, value)
173
+ ? : super < AbstractEncoder > .encodeNullableSerializableValue(serializer, value)
150
174
}
151
175
152
176
override fun encodeByte (value : Byte ) = encodeInt(value.toInt())
@@ -183,8 +207,50 @@ internal class DefaultBsonEncoder(
183
207
bsonValueCodec.encode(writer, value, EncoderContext .builder().build())
184
208
}
185
209
210
+ override fun encodeJsonElement (element : JsonElement ) = when (element) {
211
+ is JsonNull -> encodeNull()
212
+ is JsonPrimitive -> {
213
+ val content = element.content
214
+ when {
215
+ element.isString -> encodeString(content)
216
+ content == " true" || content == " false" ->
217
+ encodeBoolean(content.toBooleanStrict())
218
+ else -> {
219
+ val decimal = BigDecimal (content)
220
+ when {
221
+ decimal.stripTrailingZeros().scale() > 0 &&
222
+ DOUBLE_MIN_VALUE <= decimal && decimal <= DOUBLE_MAX_VALUE ->
223
+ encodeDouble(element.double)
224
+ INT_MIN_VALUE <= decimal && decimal <= INT_MAX_VALUE ->
225
+ encodeInt(element.int)
226
+ LONG_MIN_VALUE <= decimal && decimal <= LONG_MAX_VALUE ->
227
+ encodeLong(element.long)
228
+ else -> writer.writeDecimal128(Decimal128 (decimal))
229
+ }
230
+ }
231
+ }
232
+ }
233
+ is JsonObject -> encodeJsonObject(element)
234
+ is JsonArray -> encodeJsonArray(element)
235
+ }
236
+
186
237
override fun writer (): BsonWriter = writer
187
238
239
+ private fun encodeJsonObject (obj : JsonObject ) {
240
+ writer.writeStartDocument()
241
+ obj.forEach { k, v ->
242
+ writer.writeName(k)
243
+ encodeJsonElement(v)
244
+ }
245
+ writer.writeEndDocument()
246
+ }
247
+
248
+ private fun encodeJsonArray (array : JsonArray ) {
249
+ writer.writeStartArray()
250
+ array.forEach(::encodeJsonElement)
251
+ writer.writeEndArray()
252
+ }
253
+
188
254
private fun encodeName (value : Any ) {
189
255
writer.writeName(value.toString())
190
256
deferredElementName = null
0 commit comments