@@ -12,8 +12,8 @@ import kotlin.reflect.KClass
12
12
import kotlin.reflect.KParameter
13
13
import kotlin.reflect.KType
14
14
import kotlin.reflect.full.cast
15
+ import kotlin.reflect.full.declaredMemberProperties
15
16
import kotlin.reflect.full.isSubtypeOf
16
- import kotlin.reflect.full.memberProperties
17
17
import kotlin.reflect.full.primaryConstructor
18
18
import kotlin.reflect.full.starProjectedType
19
19
import kotlin.reflect.full.withNullability
@@ -50,8 +50,9 @@ fun JsonObject.arrayField(key: String, vararg values: Any) {
50
50
* @return the value of the first field matching the name or null
51
51
*/
52
52
fun JsonObject.flexGet (name : String , ignoreCase : Boolean = true, ignoreUnderscores : Boolean = true): JsonElement ? {
53
- val key = keys.filter { normalize(it, ignoreCase, ignoreUnderscores) == normalize(name, ignoreCase, ignoreUnderscores) }
54
- .firstOrNull()
53
+ val key =
54
+ keys.filter { normalize(it, ignoreCase, ignoreUnderscores) == normalize(name, ignoreCase, ignoreUnderscores) }
55
+ .firstOrNull()
55
56
return if (key != null ) {
56
57
val value = get(key)
57
58
if (value?.isNull() == true ) {
@@ -120,19 +121,30 @@ fun <T : Any> JsonObject.construct(clazz: KClass<T>): T {
120
121
fun <T : Any > JsonObject.fill (obj : T ): JsonObject {
121
122
val clazz = obj::class
122
123
123
- for (memberProperty in clazz.memberProperties ) {
124
+ for (memberProperty in clazz.declaredMemberProperties ) {
124
125
val propertyName = memberProperty.name
125
126
val jsonName = toUnderscore(propertyName)
126
127
127
- val value = memberProperty.getter.call(obj)
128
- if (memberProperty.returnType.isSubtypeOf(Enum ::class .starProjectedType)) {
129
- val enumValue = value as Enum <* >
130
- put(jsonName, enumValue.name)
131
- } else {
132
- val returnType = memberProperty.returnType
133
- val jsonElement: JsonElement = jsonElement(returnType, value)
128
+ try {
129
+ val value = memberProperty.getter.call(obj)
130
+ if (memberProperty.returnType.isSubtypeOf(Enum ::class .starProjectedType)) {
131
+ val enumValue = value as Enum <* >
132
+ put(jsonName, enumValue.name)
133
+ } else {
134
+ val returnType = memberProperty.returnType
135
+ val jsonElement: JsonElement = jsonElement(returnType, value)
134
136
135
- put(jsonName, jsonElement)
137
+ put(jsonName, jsonElement)
138
+ }
139
+ } catch (e: UnsupportedOperationException ) {
140
+ // function properties fail, skip those
141
+ if (! (e.message?.contains(" internal synthetic class" ) ? : false )) {
142
+ throw e
143
+ } else {
144
+ @Suppress(" UNCHECKED_CAST" ) // this seems to work ;-), ugly though
145
+ val fn = (memberProperty.call(obj) ? : throw e) as Function0 <Any >
146
+ put(jsonName, fn.invoke())
147
+ }
136
148
}
137
149
}
138
150
return this
0 commit comments