xref: /aosp_15_r20/external/kotlinx.serialization/docs/builtin-classes.md (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)
1*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST_NAME BuiltinClassesTest -->
2*57b5a4a6SAndroid Build Coastguard Worker
3*57b5a4a6SAndroid Build Coastguard Worker# Builtin classes
4*57b5a4a6SAndroid Build Coastguard Worker
5*57b5a4a6SAndroid Build Coastguard WorkerThis is the second chapter of the [Kotlin Serialization Guide](serialization-guide.md).
6*57b5a4a6SAndroid Build Coastguard WorkerIn addition to all the primitive types and strings, serialization for some classes from the Kotlin standard library,
7*57b5a4a6SAndroid Build Coastguard Workerincluding the standard collections, is built into Kotlin Serialization. This chapter explains the details.
8*57b5a4a6SAndroid Build Coastguard Worker
9*57b5a4a6SAndroid Build Coastguard Worker**Table of contents**
10*57b5a4a6SAndroid Build Coastguard Worker
11*57b5a4a6SAndroid Build Coastguard Worker<!--- TOC -->
12*57b5a4a6SAndroid Build Coastguard Worker
13*57b5a4a6SAndroid Build Coastguard Worker* [Primitives](#primitives)
14*57b5a4a6SAndroid Build Coastguard Worker  * [Numbers](#numbers)
15*57b5a4a6SAndroid Build Coastguard Worker  * [Long numbers](#long-numbers)
16*57b5a4a6SAndroid Build Coastguard Worker  * [Long numbers as strings](#long-numbers-as-strings)
17*57b5a4a6SAndroid Build Coastguard Worker  * [Enum classes](#enum-classes)
18*57b5a4a6SAndroid Build Coastguard Worker  * [Serial names of enum entries](#serial-names-of-enum-entries)
19*57b5a4a6SAndroid Build Coastguard Worker* [Composites](#composites)
20*57b5a4a6SAndroid Build Coastguard Worker  * [Pair and triple](#pair-and-triple)
21*57b5a4a6SAndroid Build Coastguard Worker  * [Lists](#lists)
22*57b5a4a6SAndroid Build Coastguard Worker  * [Sets and other collections](#sets-and-other-collections)
23*57b5a4a6SAndroid Build Coastguard Worker  * [Deserializing collections](#deserializing-collections)
24*57b5a4a6SAndroid Build Coastguard Worker  * [Maps](#maps)
25*57b5a4a6SAndroid Build Coastguard Worker  * [Unit and singleton objects](#unit-and-singleton-objects)
26*57b5a4a6SAndroid Build Coastguard Worker  * [Duration](#duration)
27*57b5a4a6SAndroid Build Coastguard Worker* [Nothing](#nothing)
28*57b5a4a6SAndroid Build Coastguard Worker
29*57b5a4a6SAndroid Build Coastguard Worker<!--- END -->
30*57b5a4a6SAndroid Build Coastguard Worker
31*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE .*-builtin-.*
32*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.*
33*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.json.*
34*57b5a4a6SAndroid Build Coastguard Worker-->
35*57b5a4a6SAndroid Build Coastguard Worker
36*57b5a4a6SAndroid Build Coastguard Worker## Primitives
37*57b5a4a6SAndroid Build Coastguard Worker
38*57b5a4a6SAndroid Build Coastguard WorkerKotlin Serialization has the following ten primitives:
39*57b5a4a6SAndroid Build Coastguard Worker`Boolean`, `Byte`, `Short`, `Int`, `Long`, `Float`, `Double`, `Char`, `String`, and enums.
40*57b5a4a6SAndroid Build Coastguard WorkerThe other types in Kotlin Serialization are _composite_&mdash;composed of those primitive values.
41*57b5a4a6SAndroid Build Coastguard Worker
42*57b5a4a6SAndroid Build Coastguard Worker### Numbers
43*57b5a4a6SAndroid Build Coastguard Worker
44*57b5a4a6SAndroid Build Coastguard WorkerAll types of integer and floating-point Kotlin numbers can be serialized.
45*57b5a4a6SAndroid Build Coastguard Worker
46*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE
47*57b5a4a6SAndroid Build Coastguard Workerimport kotlin.math.*
48*57b5a4a6SAndroid Build Coastguard Worker-->
49*57b5a4a6SAndroid Build Coastguard Worker
50*57b5a4a6SAndroid Build Coastguard Worker```kotlin
51*57b5a4a6SAndroid Build Coastguard Worker@Serializable
52*57b5a4a6SAndroid Build Coastguard Workerclass Data(
53*57b5a4a6SAndroid Build Coastguard Worker    val answer: Int,
54*57b5a4a6SAndroid Build Coastguard Worker    val pi: Double
55*57b5a4a6SAndroid Build Coastguard Worker)
56*57b5a4a6SAndroid Build Coastguard Worker
57*57b5a4a6SAndroid Build Coastguard Workerfun main() {
58*57b5a4a6SAndroid Build Coastguard Worker    val data = Data(42, PI)
59*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(data))
60*57b5a4a6SAndroid Build Coastguard Worker}
61*57b5a4a6SAndroid Build Coastguard Worker```
62*57b5a4a6SAndroid Build Coastguard Worker
63*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-01.kt).
64*57b5a4a6SAndroid Build Coastguard Worker
65*57b5a4a6SAndroid Build Coastguard WorkerTheir natural representation in JSON is used.
66*57b5a4a6SAndroid Build Coastguard Worker
67*57b5a4a6SAndroid Build Coastguard Worker```text
68*57b5a4a6SAndroid Build Coastguard Worker{"answer":42,"pi":3.141592653589793}
69*57b5a4a6SAndroid Build Coastguard Worker```
70*57b5a4a6SAndroid Build Coastguard Worker
71*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
72*57b5a4a6SAndroid Build Coastguard Worker
73*57b5a4a6SAndroid Build Coastguard Worker
74*57b5a4a6SAndroid Build Coastguard Worker### Long numbers
75*57b5a4a6SAndroid Build Coastguard Worker
76*57b5a4a6SAndroid Build Coastguard WorkerLong integers are serializable, too.
77*57b5a4a6SAndroid Build Coastguard Worker
78*57b5a4a6SAndroid Build Coastguard Worker```kotlin
79*57b5a4a6SAndroid Build Coastguard Worker@Serializable
80*57b5a4a6SAndroid Build Coastguard Workerclass Data(val signature: Long)
81*57b5a4a6SAndroid Build Coastguard Worker
82*57b5a4a6SAndroid Build Coastguard Workerfun main() {
83*57b5a4a6SAndroid Build Coastguard Worker    val data = Data(0x1CAFE2FEED0BABE0)
84*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(data))
85*57b5a4a6SAndroid Build Coastguard Worker}
86*57b5a4a6SAndroid Build Coastguard Worker```
87*57b5a4a6SAndroid Build Coastguard Worker
88*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-02.kt).
89*57b5a4a6SAndroid Build Coastguard Worker
90*57b5a4a6SAndroid Build Coastguard WorkerBy default they are serialized to JSON as numbers.
91*57b5a4a6SAndroid Build Coastguard Worker
92*57b5a4a6SAndroid Build Coastguard Worker```text
93*57b5a4a6SAndroid Build Coastguard Worker{"signature":2067120338512882656}
94*57b5a4a6SAndroid Build Coastguard Worker```
95*57b5a4a6SAndroid Build Coastguard Worker
96*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
97*57b5a4a6SAndroid Build Coastguard Worker
98*57b5a4a6SAndroid Build Coastguard Worker### Long numbers as strings
99*57b5a4a6SAndroid Build Coastguard Worker
100*57b5a4a6SAndroid Build Coastguard WorkerThe JSON output from the previous example will get decoded normally by Kotlin Serialization running on Kotlin/JS.
101*57b5a4a6SAndroid Build Coastguard WorkerHowever, if we try to parse this JSON by native JavaScript methods, we get this truncated result.
102*57b5a4a6SAndroid Build Coastguard Worker
103*57b5a4a6SAndroid Build Coastguard Worker```
104*57b5a4a6SAndroid Build Coastguard WorkerJSON.parse("{\"signature\":2067120338512882656}")
105*57b5a4a6SAndroid Build Coastguard Worker▶ {signature: 2067120338512882700}
106*57b5a4a6SAndroid Build Coastguard Worker```
107*57b5a4a6SAndroid Build Coastguard Worker
108*57b5a4a6SAndroid Build Coastguard WorkerThe full range of a Kotlin Long does not fit in the JavaScript number, so its precision gets lost in JavaScript.
109*57b5a4a6SAndroid Build Coastguard WorkerA common workaround is to represent long numbers with full precision using the JSON string type.
110*57b5a4a6SAndroid Build Coastguard WorkerThis approach is optionally supported by Kotlin Serialization with [LongAsStringSerializer], which
111*57b5a4a6SAndroid Build Coastguard Workercan be specified for a given Long property using the [`@Serializable`][Serializable] annotation:
112*57b5a4a6SAndroid Build Coastguard Worker
113*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE
114*57b5a4a6SAndroid Build Coastguard Workerimport kotlinx.serialization.builtins.*
115*57b5a4a6SAndroid Build Coastguard Worker-->
116*57b5a4a6SAndroid Build Coastguard Worker
117*57b5a4a6SAndroid Build Coastguard Worker```kotlin
118*57b5a4a6SAndroid Build Coastguard Worker@Serializable
119*57b5a4a6SAndroid Build Coastguard Workerclass Data(
120*57b5a4a6SAndroid Build Coastguard Worker    @Serializable(with=LongAsStringSerializer::class)
121*57b5a4a6SAndroid Build Coastguard Worker    val signature: Long
122*57b5a4a6SAndroid Build Coastguard Worker)
123*57b5a4a6SAndroid Build Coastguard Worker
124*57b5a4a6SAndroid Build Coastguard Workerfun main() {
125*57b5a4a6SAndroid Build Coastguard Worker    val data = Data(0x1CAFE2FEED0BABE0)
126*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(data))
127*57b5a4a6SAndroid Build Coastguard Worker}
128*57b5a4a6SAndroid Build Coastguard Worker```
129*57b5a4a6SAndroid Build Coastguard Worker
130*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-03.kt).
131*57b5a4a6SAndroid Build Coastguard Worker
132*57b5a4a6SAndroid Build Coastguard WorkerThis JSON gets parsed natively by JavaScript without loss of precision.
133*57b5a4a6SAndroid Build Coastguard Worker
134*57b5a4a6SAndroid Build Coastguard Worker```text
135*57b5a4a6SAndroid Build Coastguard Worker{"signature":"2067120338512882656"}
136*57b5a4a6SAndroid Build Coastguard Worker```
137*57b5a4a6SAndroid Build Coastguard Worker
138*57b5a4a6SAndroid Build Coastguard Worker> The section on [Specifying serializers for a file](serializers.md#specifying-serializers-for-a-file) explains how a
139*57b5a4a6SAndroid Build Coastguard Worker> serializer like `LongAsStringSerializer` can be specified for all properties in a file.
140*57b5a4a6SAndroid Build Coastguard Worker
141*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
142*57b5a4a6SAndroid Build Coastguard Worker
143*57b5a4a6SAndroid Build Coastguard Worker### Enum classes
144*57b5a4a6SAndroid Build Coastguard Worker
145*57b5a4a6SAndroid Build Coastguard WorkerAll enum classes are serializable out of the box without having to mark them `@Serializable`,
146*57b5a4a6SAndroid Build Coastguard Workeras the following example shows.
147*57b5a4a6SAndroid Build Coastguard Worker
148*57b5a4a6SAndroid Build Coastguard Worker```kotlin
149*57b5a4a6SAndroid Build Coastguard Worker// The @Serializable annotation is not needed for enum classes
150*57b5a4a6SAndroid Build Coastguard Workerenum class Status { SUPPORTED }
151*57b5a4a6SAndroid Build Coastguard Worker
152*57b5a4a6SAndroid Build Coastguard Worker@Serializable
153*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String, val status: Status)
154*57b5a4a6SAndroid Build Coastguard Worker
155*57b5a4a6SAndroid Build Coastguard Workerfun main() {
156*57b5a4a6SAndroid Build Coastguard Worker    val data = Project("kotlinx.serialization", Status.SUPPORTED)
157*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(data))
158*57b5a4a6SAndroid Build Coastguard Worker}
159*57b5a4a6SAndroid Build Coastguard Worker```
160*57b5a4a6SAndroid Build Coastguard Worker
161*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-04.kt).
162*57b5a4a6SAndroid Build Coastguard Worker
163*57b5a4a6SAndroid Build Coastguard WorkerIn JSON an enum gets encoded as a string.
164*57b5a4a6SAndroid Build Coastguard Worker
165*57b5a4a6SAndroid Build Coastguard Worker```text
166*57b5a4a6SAndroid Build Coastguard Worker{"name":"kotlinx.serialization","status":"SUPPORTED"}
167*57b5a4a6SAndroid Build Coastguard Worker```
168*57b5a4a6SAndroid Build Coastguard Worker
169*57b5a4a6SAndroid Build Coastguard Worker> Note: On Kotlin/JS and Kotlin/Native, `@Serializable` annotation is needed for enum class if you want to use it as a root object — i.e. use `encodeToString<Status>(Status.SUPPORTED)`.
170*57b5a4a6SAndroid Build Coastguard Worker
171*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
172*57b5a4a6SAndroid Build Coastguard Worker
173*57b5a4a6SAndroid Build Coastguard Worker### Serial names of enum entries
174*57b5a4a6SAndroid Build Coastguard Worker
175*57b5a4a6SAndroid Build Coastguard WorkerSerial names of enum entries can be customized with the [SerialName] annotation just like
176*57b5a4a6SAndroid Build Coastguard Workerit was shown for properties in the [Serial field names](basic-serialization.md#serial-field-names) section.
177*57b5a4a6SAndroid Build Coastguard WorkerHowever, in this case, the whole enum class must be marked with the [`@Serializable`][Serializable] annotation.
178*57b5a4a6SAndroid Build Coastguard Worker
179*57b5a4a6SAndroid Build Coastguard Worker```kotlin
180*57b5a4a6SAndroid Build Coastguard Worker@Serializable // required because of @SerialName
181*57b5a4a6SAndroid Build Coastguard Workerenum class Status { @SerialName("maintained") SUPPORTED }
182*57b5a4a6SAndroid Build Coastguard Worker
183*57b5a4a6SAndroid Build Coastguard Worker@Serializable
184*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String, val status: Status)
185*57b5a4a6SAndroid Build Coastguard Worker
186*57b5a4a6SAndroid Build Coastguard Workerfun main() {
187*57b5a4a6SAndroid Build Coastguard Worker    val data = Project("kotlinx.serialization", Status.SUPPORTED)
188*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(data))
189*57b5a4a6SAndroid Build Coastguard Worker}
190*57b5a4a6SAndroid Build Coastguard Worker```
191*57b5a4a6SAndroid Build Coastguard Worker
192*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-05.kt).
193*57b5a4a6SAndroid Build Coastguard Worker
194*57b5a4a6SAndroid Build Coastguard WorkerWe see that the specified serial name is now used in the resulting JSON.
195*57b5a4a6SAndroid Build Coastguard Worker
196*57b5a4a6SAndroid Build Coastguard Worker```text
197*57b5a4a6SAndroid Build Coastguard Worker{"name":"kotlinx.serialization","status":"maintained"}
198*57b5a4a6SAndroid Build Coastguard Worker```
199*57b5a4a6SAndroid Build Coastguard Worker
200*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
201*57b5a4a6SAndroid Build Coastguard Worker
202*57b5a4a6SAndroid Build Coastguard Worker## Composites
203*57b5a4a6SAndroid Build Coastguard Worker
204*57b5a4a6SAndroid Build Coastguard WorkerA number of composite types from the standard library are supported by Kotlin Serialization.
205*57b5a4a6SAndroid Build Coastguard Worker
206*57b5a4a6SAndroid Build Coastguard Worker### Pair and triple
207*57b5a4a6SAndroid Build Coastguard Worker
208*57b5a4a6SAndroid Build Coastguard WorkerThe simple data classes [Pair] and [Triple] from the Kotlin standard library are serializable.
209*57b5a4a6SAndroid Build Coastguard Worker
210*57b5a4a6SAndroid Build Coastguard Worker```kotlin
211*57b5a4a6SAndroid Build Coastguard Worker@Serializable
212*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String)
213*57b5a4a6SAndroid Build Coastguard Worker
214*57b5a4a6SAndroid Build Coastguard Workerfun main() {
215*57b5a4a6SAndroid Build Coastguard Worker    val pair = 1 to Project("kotlinx.serialization")
216*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(pair))
217*57b5a4a6SAndroid Build Coastguard Worker}
218*57b5a4a6SAndroid Build Coastguard Worker```
219*57b5a4a6SAndroid Build Coastguard Worker
220*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-06.kt).
221*57b5a4a6SAndroid Build Coastguard Worker
222*57b5a4a6SAndroid Build Coastguard Worker```text
223*57b5a4a6SAndroid Build Coastguard Worker{"first":1,"second":{"name":"kotlinx.serialization"}}
224*57b5a4a6SAndroid Build Coastguard Worker```
225*57b5a4a6SAndroid Build Coastguard Worker
226*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
227*57b5a4a6SAndroid Build Coastguard Worker
228*57b5a4a6SAndroid Build Coastguard Worker> Not all classes from the Kotlin standard library are serializable. In particular, ranges and the [Regex] class
229*57b5a4a6SAndroid Build Coastguard Worker> are not serializable at the moment. Support for their serialization may be added in the future.
230*57b5a4a6SAndroid Build Coastguard Worker
231*57b5a4a6SAndroid Build Coastguard Worker### Lists
232*57b5a4a6SAndroid Build Coastguard Worker
233*57b5a4a6SAndroid Build Coastguard WorkerA [List] of serializable classes can be serialized.
234*57b5a4a6SAndroid Build Coastguard Worker
235*57b5a4a6SAndroid Build Coastguard Worker```kotlin
236*57b5a4a6SAndroid Build Coastguard Worker@Serializable
237*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String)
238*57b5a4a6SAndroid Build Coastguard Worker
239*57b5a4a6SAndroid Build Coastguard Workerfun main() {
240*57b5a4a6SAndroid Build Coastguard Worker    val list = listOf(
241*57b5a4a6SAndroid Build Coastguard Worker        Project("kotlinx.serialization"),
242*57b5a4a6SAndroid Build Coastguard Worker        Project("kotlinx.coroutines")
243*57b5a4a6SAndroid Build Coastguard Worker    )
244*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(list))
245*57b5a4a6SAndroid Build Coastguard Worker}
246*57b5a4a6SAndroid Build Coastguard Worker```
247*57b5a4a6SAndroid Build Coastguard Worker
248*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-07.kt).
249*57b5a4a6SAndroid Build Coastguard Worker
250*57b5a4a6SAndroid Build Coastguard WorkerThe result is represented as a list in JSON.
251*57b5a4a6SAndroid Build Coastguard Worker
252*57b5a4a6SAndroid Build Coastguard Worker```text
253*57b5a4a6SAndroid Build Coastguard Worker[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}]
254*57b5a4a6SAndroid Build Coastguard Worker```
255*57b5a4a6SAndroid Build Coastguard Worker
256*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
257*57b5a4a6SAndroid Build Coastguard Worker
258*57b5a4a6SAndroid Build Coastguard Worker### Sets and other collections
259*57b5a4a6SAndroid Build Coastguard Worker
260*57b5a4a6SAndroid Build Coastguard WorkerOther collections, like [Set], are also serializable.
261*57b5a4a6SAndroid Build Coastguard Worker
262*57b5a4a6SAndroid Build Coastguard Worker```kotlin
263*57b5a4a6SAndroid Build Coastguard Worker@Serializable
264*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String)
265*57b5a4a6SAndroid Build Coastguard Worker
266*57b5a4a6SAndroid Build Coastguard Workerfun main() {
267*57b5a4a6SAndroid Build Coastguard Worker    val set = setOf(
268*57b5a4a6SAndroid Build Coastguard Worker        Project("kotlinx.serialization"),
269*57b5a4a6SAndroid Build Coastguard Worker        Project("kotlinx.coroutines")
270*57b5a4a6SAndroid Build Coastguard Worker    )
271*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(set))
272*57b5a4a6SAndroid Build Coastguard Worker}
273*57b5a4a6SAndroid Build Coastguard Worker```
274*57b5a4a6SAndroid Build Coastguard Worker
275*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-08.kt).
276*57b5a4a6SAndroid Build Coastguard Worker
277*57b5a4a6SAndroid Build Coastguard Worker[Set] is also represented as a list in JSON, like all other collections.
278*57b5a4a6SAndroid Build Coastguard Worker
279*57b5a4a6SAndroid Build Coastguard Worker```text
280*57b5a4a6SAndroid Build Coastguard Worker[{"name":"kotlinx.serialization"},{"name":"kotlinx.coroutines"}]
281*57b5a4a6SAndroid Build Coastguard Worker```
282*57b5a4a6SAndroid Build Coastguard Worker
283*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
284*57b5a4a6SAndroid Build Coastguard Worker
285*57b5a4a6SAndroid Build Coastguard Worker### Deserializing collections
286*57b5a4a6SAndroid Build Coastguard Worker
287*57b5a4a6SAndroid Build Coastguard WorkerDuring deserialization, the type of the resulting object is determined by the static type that was specified
288*57b5a4a6SAndroid Build Coastguard Workerin the source code&mdash;either as the type of the property or as the type parameter of the decoding function.
289*57b5a4a6SAndroid Build Coastguard WorkerThe following example shows how the same JSON list of integers is deserialized into two properties of
290*57b5a4a6SAndroid Build Coastguard Workerdifferent Kotlin types.
291*57b5a4a6SAndroid Build Coastguard Worker
292*57b5a4a6SAndroid Build Coastguard Worker```kotlin
293*57b5a4a6SAndroid Build Coastguard Worker@Serializable
294*57b5a4a6SAndroid Build Coastguard Workerdata class Data(
295*57b5a4a6SAndroid Build Coastguard Worker    val a: List<Int>,
296*57b5a4a6SAndroid Build Coastguard Worker    val b: Set<Int>
297*57b5a4a6SAndroid Build Coastguard Worker)
298*57b5a4a6SAndroid Build Coastguard Worker
299*57b5a4a6SAndroid Build Coastguard Workerfun main() {
300*57b5a4a6SAndroid Build Coastguard Worker    val data = Json.decodeFromString<Data>("""
301*57b5a4a6SAndroid Build Coastguard Worker        {
302*57b5a4a6SAndroid Build Coastguard Worker            "a": [42, 42],
303*57b5a4a6SAndroid Build Coastguard Worker            "b": [42, 42]
304*57b5a4a6SAndroid Build Coastguard Worker        }
305*57b5a4a6SAndroid Build Coastguard Worker    """)
306*57b5a4a6SAndroid Build Coastguard Worker    println(data)
307*57b5a4a6SAndroid Build Coastguard Worker}
308*57b5a4a6SAndroid Build Coastguard Worker```
309*57b5a4a6SAndroid Build Coastguard Worker
310*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-09.kt).
311*57b5a4a6SAndroid Build Coastguard Worker
312*57b5a4a6SAndroid Build Coastguard WorkerBecause the `data.b` property is a [Set], the duplicate values from it disappeared.
313*57b5a4a6SAndroid Build Coastguard Worker
314*57b5a4a6SAndroid Build Coastguard Worker```text
315*57b5a4a6SAndroid Build Coastguard WorkerData(a=[42, 42], b=[42])
316*57b5a4a6SAndroid Build Coastguard Worker```
317*57b5a4a6SAndroid Build Coastguard Worker
318*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
319*57b5a4a6SAndroid Build Coastguard Worker
320*57b5a4a6SAndroid Build Coastguard Worker### Maps
321*57b5a4a6SAndroid Build Coastguard Worker
322*57b5a4a6SAndroid Build Coastguard WorkerA [Map] with primitive or enum keys and arbitrary serializable values can be serialized.
323*57b5a4a6SAndroid Build Coastguard Worker
324*57b5a4a6SAndroid Build Coastguard Worker```kotlin
325*57b5a4a6SAndroid Build Coastguard Worker@Serializable
326*57b5a4a6SAndroid Build Coastguard Workerclass Project(val name: String)
327*57b5a4a6SAndroid Build Coastguard Worker
328*57b5a4a6SAndroid Build Coastguard Workerfun main() {
329*57b5a4a6SAndroid Build Coastguard Worker    val map = mapOf(
330*57b5a4a6SAndroid Build Coastguard Worker        1 to Project("kotlinx.serialization"),
331*57b5a4a6SAndroid Build Coastguard Worker        2 to Project("kotlinx.coroutines")
332*57b5a4a6SAndroid Build Coastguard Worker    )
333*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(map))
334*57b5a4a6SAndroid Build Coastguard Worker}
335*57b5a4a6SAndroid Build Coastguard Worker```
336*57b5a4a6SAndroid Build Coastguard Worker
337*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-10.kt).
338*57b5a4a6SAndroid Build Coastguard Worker
339*57b5a4a6SAndroid Build Coastguard WorkerKotlin maps in JSON are represented as objects. In JSON object keys are always strings, so keys are encoded as strings
340*57b5a4a6SAndroid Build Coastguard Workereven if they are numbers in Kotlin, as we can see below.
341*57b5a4a6SAndroid Build Coastguard Worker
342*57b5a4a6SAndroid Build Coastguard Worker```text
343*57b5a4a6SAndroid Build Coastguard Worker{"1":{"name":"kotlinx.serialization"},"2":{"name":"kotlinx.coroutines"}}
344*57b5a4a6SAndroid Build Coastguard Worker```
345*57b5a4a6SAndroid Build Coastguard Worker
346*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
347*57b5a4a6SAndroid Build Coastguard Worker
348*57b5a4a6SAndroid Build Coastguard Worker> It is a JSON-specific limitation that keys cannot be composite.
349*57b5a4a6SAndroid Build Coastguard Worker> It can be lifted as shown in the [Allowing structured map keys](json.md#allowing-structured-map-keys) section.
350*57b5a4a6SAndroid Build Coastguard Worker
351*57b5a4a6SAndroid Build Coastguard Worker
352*57b5a4a6SAndroid Build Coastguard Worker### Unit and singleton objects
353*57b5a4a6SAndroid Build Coastguard Worker
354*57b5a4a6SAndroid Build Coastguard WorkerThe Kotlin builtin `Unit` type is also serializable.
355*57b5a4a6SAndroid Build Coastguard Worker`Unit` is a Kotlin [singleton object](https://kotlinlang.org/docs/tutorials/kotlin-for-py/objects-and-companion-objects.html),
356*57b5a4a6SAndroid Build Coastguard Workerand is handled equally with other Kotlin objects.
357*57b5a4a6SAndroid Build Coastguard Worker
358*57b5a4a6SAndroid Build Coastguard WorkerConceptually, a singleton is a class with only one instance, meaning that state does not define the object,
359*57b5a4a6SAndroid Build Coastguard Workerbut the object defines its state. In JSON, objects are serialized as empty structures.
360*57b5a4a6SAndroid Build Coastguard Worker
361*57b5a4a6SAndroid Build Coastguard Worker```kotlin
362*57b5a4a6SAndroid Build Coastguard Worker@Serializable
363*57b5a4a6SAndroid Build Coastguard Workerobject SerializationVersion {
364*57b5a4a6SAndroid Build Coastguard Worker    val libraryVersion: String = "1.0.0"
365*57b5a4a6SAndroid Build Coastguard Worker}
366*57b5a4a6SAndroid Build Coastguard Worker
367*57b5a4a6SAndroid Build Coastguard Workerfun main() {
368*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(SerializationVersion))
369*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(Unit))
370*57b5a4a6SAndroid Build Coastguard Worker}
371*57b5a4a6SAndroid Build Coastguard Worker```
372*57b5a4a6SAndroid Build Coastguard Worker
373*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-11.kt).
374*57b5a4a6SAndroid Build Coastguard Worker
375*57b5a4a6SAndroid Build Coastguard WorkerWhile it may seem useless at first glance, this comes in handy for sealed class serialization,
376*57b5a4a6SAndroid Build Coastguard Workerwhich is explained in the [Polymorphism. Objects](polymorphism.md#objects) section.
377*57b5a4a6SAndroid Build Coastguard Worker
378*57b5a4a6SAndroid Build Coastguard Worker```text
379*57b5a4a6SAndroid Build Coastguard Worker{}
380*57b5a4a6SAndroid Build Coastguard Worker{}
381*57b5a4a6SAndroid Build Coastguard Worker```
382*57b5a4a6SAndroid Build Coastguard Worker
383*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
384*57b5a4a6SAndroid Build Coastguard Worker
385*57b5a4a6SAndroid Build Coastguard Worker> Serialization of objects is format specific. Other formats may represent objects differently,
386*57b5a4a6SAndroid Build Coastguard Worker> e.g. using their fully-qualified names.
387*57b5a4a6SAndroid Build Coastguard Worker
388*57b5a4a6SAndroid Build Coastguard Worker### Duration
389*57b5a4a6SAndroid Build Coastguard Worker
390*57b5a4a6SAndroid Build Coastguard WorkerSince Kotlin `1.7.20` the [Duration] class has become serializable.
391*57b5a4a6SAndroid Build Coastguard Worker
392*57b5a4a6SAndroid Build Coastguard Worker<!--- INCLUDE
393*57b5a4a6SAndroid Build Coastguard Workerimport kotlin.time.*
394*57b5a4a6SAndroid Build Coastguard Worker-->
395*57b5a4a6SAndroid Build Coastguard Worker
396*57b5a4a6SAndroid Build Coastguard Worker```kotlin
397*57b5a4a6SAndroid Build Coastguard Workerfun main() {
398*57b5a4a6SAndroid Build Coastguard Worker    val duration = 1000.toDuration(DurationUnit.SECONDS)
399*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(duration))
400*57b5a4a6SAndroid Build Coastguard Worker}
401*57b5a4a6SAndroid Build Coastguard Worker```
402*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-12.kt).
403*57b5a4a6SAndroid Build Coastguard Worker
404*57b5a4a6SAndroid Build Coastguard WorkerDuration is serialized as a string in the ISO-8601-2 format.
405*57b5a4a6SAndroid Build Coastguard Worker```text
406*57b5a4a6SAndroid Build Coastguard Worker"PT16M40S"
407*57b5a4a6SAndroid Build Coastguard Worker```
408*57b5a4a6SAndroid Build Coastguard Worker
409*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
410*57b5a4a6SAndroid Build Coastguard Worker
411*57b5a4a6SAndroid Build Coastguard Worker
412*57b5a4a6SAndroid Build Coastguard Worker## Nothing
413*57b5a4a6SAndroid Build Coastguard Worker
414*57b5a4a6SAndroid Build Coastguard WorkerBy default, [Nothing] is a serializable class. However, since there are no instances of this class, it is impossible to encode or decode its values - any attempt will cause an exception.
415*57b5a4a6SAndroid Build Coastguard Worker
416*57b5a4a6SAndroid Build Coastguard WorkerThis serializer is used when syntactically some type is needed, but it is not actually used in serialization. For example, when using parameterized polymorphic base classes:
417*57b5a4a6SAndroid Build Coastguard Worker```kotlin
418*57b5a4a6SAndroid Build Coastguard Worker@Serializable
419*57b5a4a6SAndroid Build Coastguard Workersealed class ParametrizedParent<out R> {
420*57b5a4a6SAndroid Build Coastguard Worker    @Serializable
421*57b5a4a6SAndroid Build Coastguard Worker    data class ChildWithoutParameter(val value: Int) : ParametrizedParent<Nothing>()
422*57b5a4a6SAndroid Build Coastguard Worker}
423*57b5a4a6SAndroid Build Coastguard Worker
424*57b5a4a6SAndroid Build Coastguard Workerfun main() {
425*57b5a4a6SAndroid Build Coastguard Worker    println(Json.encodeToString(ParametrizedParent.ChildWithoutParameter(42)))
426*57b5a4a6SAndroid Build Coastguard Worker}
427*57b5a4a6SAndroid Build Coastguard Worker```
428*57b5a4a6SAndroid Build Coastguard Worker> You can get the full code [here](../guide/example/example-builtin-13.kt).
429*57b5a4a6SAndroid Build Coastguard Worker
430*57b5a4a6SAndroid Build Coastguard WorkerWhen encoding, the serializer for the `Nothing` was not used
431*57b5a4a6SAndroid Build Coastguard Worker
432*57b5a4a6SAndroid Build Coastguard Worker```text
433*57b5a4a6SAndroid Build Coastguard Worker{"value":42}
434*57b5a4a6SAndroid Build Coastguard Worker```
435*57b5a4a6SAndroid Build Coastguard Worker
436*57b5a4a6SAndroid Build Coastguard Worker<!--- TEST -->
437*57b5a4a6SAndroid Build Coastguard Worker
438*57b5a4a6SAndroid Build Coastguard Worker---
439*57b5a4a6SAndroid Build Coastguard Worker
440*57b5a4a6SAndroid Build Coastguard WorkerThe next chapter covers [Serializers](serializers.md).
441*57b5a4a6SAndroid Build Coastguard Worker
442*57b5a4a6SAndroid Build Coastguard Worker<!-- stdlib references -->
443*57b5a4a6SAndroid Build Coastguard Worker[Double.NaN]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/-na-n.html
444*57b5a4a6SAndroid Build Coastguard Worker[Pair]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/
445*57b5a4a6SAndroid Build Coastguard Worker[Triple]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-triple/
446*57b5a4a6SAndroid Build Coastguard Worker[Regex]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/
447*57b5a4a6SAndroid Build Coastguard Worker[List]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/
448*57b5a4a6SAndroid Build Coastguard Worker[Set]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-set/
449*57b5a4a6SAndroid Build Coastguard Worker[Map]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/
450*57b5a4a6SAndroid Build Coastguard Worker[Duration]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.time/-duration/
451*57b5a4a6SAndroid Build Coastguard Worker[Nothing]: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-nothing.html
452*57b5a4a6SAndroid Build Coastguard Worker
453*57b5a4a6SAndroid Build Coastguard Worker<!--- MODULE /kotlinx-serialization-core -->
454*57b5a4a6SAndroid Build Coastguard Worker<!--- INDEX kotlinx-serialization-core/kotlinx.serialization -->
455*57b5a4a6SAndroid Build Coastguard Worker
456*57b5a4a6SAndroid Build Coastguard Worker[Serializable]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-serializable/index.html
457*57b5a4a6SAndroid Build Coastguard Worker[SerialName]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-serial-name/index.html
458*57b5a4a6SAndroid Build Coastguard Worker
459*57b5a4a6SAndroid Build Coastguard Worker<!--- MODULE /kotlinx-serialization-core -->
460*57b5a4a6SAndroid Build Coastguard Worker<!--- INDEX kotlinx-serialization-core/kotlinx.serialization.builtins -->
461*57b5a4a6SAndroid Build Coastguard Worker
462*57b5a4a6SAndroid Build Coastguard Worker[LongAsStringSerializer]: https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization.builtins/-long-as-string-serializer/index.html
463*57b5a4a6SAndroid Build Coastguard Worker
464*57b5a4a6SAndroid Build Coastguard Worker<!--- END -->
465