Skip to content

Commit 5f215bc

Browse files
committed
CHANGELOG.md v0.5.2
1 parent 4a0f536 commit 5f215bc

11 files changed

+73
-23
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- `Deserializer` reformat. `JsonItem` instances now don't need to know deserializers types except `Deserializer` itself.
55
- `@JsonField` support to let json-fields be named in other way than in deserialized object
66
- Added `DeserializerJsonItem` to support instances of `JsonItem`
7+
- `DeserializerFactory.registerDeserializer()` added to register custom deserializers
78

89
## v0.5.1
910
- Deserialization improvements

src/iris/json/JsonItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package iris.json
22

3-
import iris.json.serialization.DeserializerCache
3+
import iris.json.serialization.DeserializerFactory
44
import kotlin.reflect.typeOf
55

66
/**
@@ -67,6 +67,6 @@ interface JsonItem {
6767
}
6868

6969
inline fun <reified T>JsonItem.asObject(): T {
70-
val deserializer = DeserializerCache.getDeserializer(typeOf<T>())
70+
val deserializer = DeserializerFactory.getDeserializer(typeOf<T>())
7171
return deserializer.deserialize(this)
7272
}

src/iris/json/serialization/Deserializer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import iris.json.JsonItem
77
* @author [Ivan Ivanov](https://vk.com/irisism)
88
*/
99
interface Deserializer {
10-
fun <T: Any>deserialize(item: JsonItem): T
10+
fun <T>deserialize(item: JsonItem): T
1111
}
1212

src/iris/json/serialization/DeserializerClassImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class DeserializerClassImpl(private val constructorFunction: KFunction<*>, priva
2525
, val polymorphInfo: PolymorphInfo? = null
2626
)
2727

28-
override fun <T : Any> deserialize(item: JsonItem): T {
28+
override fun <T> deserialize(item: JsonItem): T {
2929
return getObject((item as JsonObject).getEntries())
3030
}
3131

src/iris/json/serialization/DeserializerCollectionImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class DeserializerCollectionImpl(val typeDeserializer: Deserializer) : Deseriali
1616
return res
1717
}
1818

19-
override fun <T : Any> deserialize(item: JsonItem): T {
19+
override fun <T> deserialize(item: JsonItem): T {
2020
return getObject((item as JsonArray).getList()) as T
2121
}
2222
}

src/iris/json/serialization/DeserializerCache.kt renamed to src/iris/json/serialization/DeserializerFactory.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,32 @@ import kotlin.reflect.jvm.jvmErasure
1212
* @author [Ivan Ivanov](https://vk.com/irisism)
1313
*/
1414

15-
object DeserializerCache {
15+
object DeserializerFactory {
1616
private val cache = mutableMapOf<KClass<*>, Deserializer>()
1717
private val typeCache = mutableMapOf<KType, Deserializer>()
1818

1919
fun getDeserializer(d: KClass<*>): Deserializer {
2020
return cache.getOrPut(d) { buildInstance(d) }
2121
}
2222

23+
fun registerDeserializer(d: KClass<*>, deserializer: Deserializer, force: Boolean = false) {
24+
cache[d] = deserializer
25+
val supers = d.superclasses
26+
if (supers.isEmpty())
27+
return
28+
val lastDes = if (force) null else cache[supers.last()]
29+
if (lastDes == null) {
30+
for (c in supers)
31+
cache[c] = deserializer
32+
} else {
33+
for (c in supers) {
34+
if (cache.contains(c))
35+
break
36+
cache[c] = deserializer
37+
}
38+
}
39+
}
40+
2341
fun getDeserializer(type: KType): Deserializer {
2442
return typeCache.getOrPut(type) {
2543
DeserializerPrimitiveImpl.convertType(type, null)
@@ -43,7 +61,7 @@ object DeserializerCache {
4361
private fun getMapType(type: KType): KType {
4462
val (key, value) = type.arguments
4563
if (!key.type!!.isSubtypeOf(CharSequence::class.starProjectedType))
46-
throw IllegalStateException("Map key cannot be not CharSequence inherited")
64+
throw IllegalStateException("Map key cannot be non CharSequence inherited")
4765
return value.type!!
4866
}
4967

src/iris/json/serialization/DeserializerJsonItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import iris.json.JsonItem
77
* @author [Ivan Ivanov](https://vk.com/irisism)
88
*/
99
class DeserializerJsonItem : Deserializer {
10-
override fun <T : Any> deserialize(item: JsonItem): T {
10+
override fun <T> deserialize(item: JsonItem): T {
1111
return item as T
1212
}
1313
}

src/iris/json/serialization/DeserializerMapImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class DeserializerMapImpl(val valueDeserializer: Deserializer) : DeserializerMap
1515
}
1616
}
1717

18-
override fun <T : Any> deserialize(item: JsonItem): T {
18+
override fun <T> deserialize(item: JsonItem): T {
1919
return getMap<Map<String, *>>((item as JsonObject).getEntries()) as T
2020
}
2121
}

src/iris/json/serialization/DeserializerPrimitive.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ import iris.json.JsonItem
77
* @author [Ivan Ivanov](https://vk.com/irisism)
88
*/
99
internal interface DeserializerPrimitive : Deserializer {
10-
fun getValue(value: JsonItem): Any?
10+
fun getValue(item: JsonItem): Any?
1111
}

src/iris/json/serialization/DeserializerPrimitiveImpl.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,24 +56,24 @@ class DeserializerPrimitiveImpl(val type: Type) : DeserializerPrimitive {
5656
}
5757
}
5858

59-
override fun <T : Any> deserialize(item: JsonItem): T {
59+
override fun <T> deserialize(item: JsonItem): T {
6060
return getValue(item) as T
6161
}
6262

63-
override fun getValue(value: JsonItem): Any? {
63+
override fun getValue(item: JsonItem): Any? {
6464
return when (type) {
65-
Type.INTEGER -> value.asIntOrNull()
66-
Type.LONG -> value.asLongOrNull()
67-
Type.DOUBLE -> value.asDoubleOrNull()
68-
Type.FLOAT -> value.asFloatOrNull()
69-
Type.BOOLEAN -> value.asBooleanOrNull()
70-
Type.STRING -> value.asStringOrNull()
71-
Type.DATE -> when (val obj = value.obj()) {
65+
Type.INTEGER -> item.asIntOrNull()
66+
Type.LONG -> item.asLongOrNull()
67+
Type.DOUBLE -> item.asDoubleOrNull()
68+
Type.FLOAT -> item.asFloatOrNull()
69+
Type.BOOLEAN -> item.asBooleanOrNull()
70+
Type.STRING -> item.asStringOrNull()
71+
Type.DATE -> when (val obj = item.obj()) {
7272
is Number -> Date(obj.toLong()*1000L)
7373
is String -> format.parse(obj)
7474
else -> obj
7575
}
76-
//else -> value.obj()
76+
//else -> item.obj()
7777
}
7878
}
7979
}

0 commit comments

Comments
 (0)