oligazar
8/8/2017 - 10:06 AM

Gson Deserialization helpers

Gson Deserialization


        
class OrderModelDeserializer : JsonDeserializer<Order> {

    @Throws(JsonParseException::class)
    override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Order {
        val jsonObj = json.asJsonObject
        if (!jsonObj.isJsonObject) return Order(error = Error(0, "Error when parsing. jsonArray doesn't contain a jsonObject"))
        val errorObj = jsonObj.get("error")
        if (errorObj == null) {
            // ошибки нет, парсим как нормальный Order
            val customer = jsonObj.getAsJsonObjectOrNull("customer")
            val voucher = jsonObj.getAsJsonObjectOrNull("voucher")
            val order = jsonObj.getAsJsonObjectOrNull("order")
            val delivery = jsonObj.getAsJsonObjectOrNull("delivery")
            val cards = jsonObj.getAsJsonArrayOrNull("cards")

            val orderIndo = cards?.map {
                it.getAsJsonObjectOrNull()
                        ?.getAsStringOrNull("name")
            }?.filterNotNull()?.joinToString()

            return Order(
                    voucher?.asJsonObject?.getAsStringOrNull("num") ?: "",
                    customer?.asJsonObject?.getAsStringOrNull("name") ?: "",
                    orderIndo ?: "", // order info
                    order?.asJsonObject?.getAsStringOrNull("payment_date") ?: "",
                    delivery?.getAsStringOrNull("date_time") ?: "",
                    order?.asJsonObject?.getAsIntOrNull("summa") ?: 0,  // 20-000 руб.
                    order?.asJsonObject?.getAsIntOrNull("currency") ?: 0,  // 20-000 руб.
                    order?.asJsonObject?.getAsStringOrNull("status") ?: "")
        } else {
            return Order(error =
                context.deserialize<Error>(errorObj, Error::class.java))
        }
    }
}
class Registration(
        @SerializedName("point_id") val pointId: Int = 0,
        @SerializedName("staff_id") val staffId: Int = 0,
        @SerializedName("new_token") val token: String = "",
        @SerializedName("title") val pointName: String = "",
        @SerializedName("address") val pointAddress: String = "",
        val error: Error? = null)
        
data class Order(
        val voucherNum: String = "",
        val customerName: String = "",
        val orderInfo: String = "", // не понятно, что здесь должно быть
        val paymentDate: String = "",
        val deliveryDate: String = "",
        val totalPrice: Int = 0,
        val currency: Int = 0,
        val orderStatus: String = "",
        val error: Error? = null)
fun JsonObject.getAsJsonObjectOrNull(fieldName: String): JsonObject? {
    return get(fieldName)
            ?.getAsJsonObjectOrNull(fieldName)
}

fun JsonElement.getAsJsonObjectOrNull(fieldName: String = "JsonElement"): JsonObject? {
    return run { if (isJsonObject) asJsonObject
                else {
                    Log.e("ParseJson", "$fieldName is not a JsonObject")
                    null
                }
            }
}

fun JsonObject.getAsJsonArrayOrNull(fieldName: String): JsonArray? {
    return get(fieldName)
            ?.run { if (isJsonArray) asJsonArray
                else {
                    Log.e("ParseJson", "$fieldName is not a JsonObject")
                    null
                }
            }
}

fun JsonObject.getAsStringOrNull(fieldName: String): String? {
    try {
        return get(fieldName).asString
    } catch (e: Exception) {
        e.printStackTrace()
        return null
    }
}

fun JsonObject.getAsIntOrNull(fieldName: String): Int? {
    try {
        return get(fieldName).asInt
    } catch (e: Exception) {
        e.printStackTrace()
        return null
    }
}