Skip to content

Commit a4866bb

Browse files
committed
android-bindings: added a workaround to coerce JSON names to non-strings
1 parent 64daca9 commit a4866bb

File tree

2 files changed

+35
-4
lines changed
  • android-bindings/src

2 files changed

+35
-4
lines changed

android-bindings/src/main/kotlin/net/aquadc/persistence/android/json/stream.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fun TokenStream.writeTo(writer: JsonWriter): Unit =
6767
val tokToJson = enumMapOf(
6868
Token.Null, JsonToken.NULL,
6969
Token.Bool, JsonToken.BOOLEAN,
70-
/*Token.I8, Token.I16, Token.I32, Token.I64, Token.F32, Token.F64, Token.Str, Token.Blob,*/
70+
// Token.I8, Token.I16, Token.I32, Token.I64, Token.F32, Token.F64, Token.Str, Token.Blob,
7171
Token.BeginSequence, JsonToken.BEGIN_ARRAY,
7272
Token.EndSequence, JsonToken.END_ARRAY,
7373
Token.BeginDictionary, JsonToken.BEGIN_OBJECT,
@@ -118,7 +118,14 @@ fun TokenStream.writeTo(writer: JsonWriter): Unit =
118118
return Token.EndDictionary
119119
}
120120

121-
val nextTok = if (coerceTo == null) nextToken else tokToJson[coerceTo]
121+
val nextTok = if (coerceTo == null) nextToken else {
122+
if (nextToken == JsonToken.NAME && coerceTo != Token.Str)
123+
// JsonReader can't coerce names to other types, let's do it ourselves
124+
return coerceTo.coerce(reader.nextName().also(_path::onName))
125+
126+
tokToJson[coerceTo]
127+
}
128+
122129
return if (nextTok == null) {
123130
val value = when (coerceTo!!) {
124131
Token.I8 -> reader.nextInt().assertFitsByte()

android-bindings/src/test/kotlin/net/aquadc/persistence/android/PersistenceTest.kt

+26-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import net.aquadc.persistence.extended.partial
1414
import net.aquadc.persistence.struct.Schema
1515
import net.aquadc.persistence.struct.Struct
1616
import net.aquadc.persistence.struct.build
17+
import net.aquadc.persistence.tokens.Token
1718
import net.aquadc.persistence.tokens.readAs
1819
import net.aquadc.persistence.tokens.readListOf
1920
import net.aquadc.persistence.tokens.tokens
@@ -31,11 +32,13 @@ import net.aquadc.persistence.type.set
3132
import net.aquadc.persistence.type.string
3233
import net.aquadc.properties.persistence.enum
3334
import okio.ByteString.Companion.decodeHex
35+
import org.junit.Assert.assertArrayEquals
3436
import org.junit.Assert.assertEquals
3537
import org.junit.Assert.assertNotSame
3638
import org.junit.Assert.assertSame
3739
import org.junit.Test
3840
import java.io.StringWriter
41+
import java.util.Base64
3942
import java.util.EnumSet
4043

4144

@@ -153,8 +156,8 @@ class PersistenceTest {
153156
)
154157
}
155158

156-
val smallSchema = Tuple3("a", string, "b", string, "c", string)
157-
val partialSmallSchema = partial(smallSchema)
159+
private val smallSchema = Tuple3("a", string, "b", string, "c", string)
160+
private val partialSmallSchema = partial(smallSchema)
158161

159162
@Test fun `json empty partial`() {
160163
assertEquals(
@@ -238,6 +241,27 @@ class PersistenceTest {
238241
)
239242
}
240243

244+
@Test fun coercions() {
245+
val blob = byteArrayOf(1, 2, 3)
246+
val base = Base64.getEncoder().encodeToString(blob)
247+
val tokens = """{"1":"456.789","$base":"123"}""".reader().json().tokens()
248+
249+
tokens.poll(Token.BeginDictionary)
250+
251+
assertEquals(Token.Str, tokens.peek())
252+
assertEquals(1, tokens.poll(Token.I32))
253+
254+
assertEquals(Token.Str, tokens.peek())
255+
assertEquals(456.789, tokens.poll(Token.F64))
256+
257+
assertEquals(Token.Str, tokens.peek())
258+
assertArrayEquals(blob, tokens.poll(Token.Blob) as ByteArray)
259+
260+
assertEquals(Token.Str, tokens.peek())
261+
assertEquals(123, tokens.poll(Token.I32))
262+
263+
}
264+
241265
private fun <T> read(json: String, type: DataType<T>, lenient: Boolean = false): T =
242266
json.reader().json().also {
243267
it.isLenient = lenient

0 commit comments

Comments
 (0)