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
}
}