/
JsonStreams.kt
60 lines (53 loc) · 1.8 KB
/
JsonStreams.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package kotlinx.serialization.json.internal
import kotlinx.serialization.*
import kotlinx.serialization.json.DecodeSequenceMode
import kotlinx.serialization.json.Json
@PublishedApi
internal interface JsonWriter {
fun writeLong(value: Long)
fun writeChar(char: Char)
fun write(text: String)
fun writeQuoted(text: String)
fun release()
}
@PublishedApi
internal interface SerialReader {
fun read(buffer: CharArray, bufferOffset: Int, count: Int): Int
}
@PublishedApi
internal fun <T> Json.encodeByWriter(writer: JsonWriter, serializer: SerializationStrategy<T>, value: T) {
val encoder = StreamingJsonEncoder(
writer, this,
WriteMode.OBJ,
arrayOfNulls(WriteMode.values().size)
)
encoder.encodeSerializableValue(serializer, value)
}
@PublishedApi
internal fun <T> Json.decodeByReader(
deserializer: DeserializationStrategy<T>,
reader: SerialReader
): T {
val lexer = ReaderJsonLexer(reader)
val input = StreamingJsonDecoder(this, WriteMode.OBJ, lexer, deserializer.descriptor, null)
val result = input.decodeSerializableValue(deserializer)
lexer.expectEof()
return result
}
@PublishedApi
@ExperimentalSerializationApi
internal fun <T> Json.decodeToSequenceByReader(
reader: SerialReader,
deserializer: DeserializationStrategy<T>,
format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
): Sequence<T> {
val lexer = ReaderJsonLexer(reader)
val iter = JsonIterator(format, this, lexer, deserializer)
return Sequence { iter }.constrainOnce()
}
@PublishedApi
@ExperimentalSerializationApi
internal inline fun <reified T> Json.decodeToSequenceByReader(
reader: SerialReader,
format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
): Sequence<T> = decodeToSequenceByReader(reader, serializersModule.serializer(), format)