Kotlin: GSON из Json не вычисляется - PullRequest
1 голос
/ 27 января 2020

Я успешно получаю объект JSON в качестве запроса и передаю его моему анализатору. Код работает до тех пор, пока я не позвоню с Json, а затем застревает. Что я делаю не так?

Вот соответствующий класс:

class User(@SerializedName("mac") private val phoneMac: String) : Comparable<User> {

    @SerializedName("values")
    private val measurements: MutableSet<Measurement> = mutableSetOf()

    fun getPhoneMac(): String = phoneMac
    fun getMeasurements(): Set<Measurement> = measurements

    //etc.
}

, который относится к этому классу:

class Measurement (@SerializedName("mac") val deviceMac: String, val timestamp: String, val value: Double, val valueType: ValueType) : Comparable<Measurement>{

    fun getDeviceMac(): String = deviceMac
    fun getTimestamp(): String = timestamp
    fun getValue(): Double = value
    fun getValueType(): ValueType = valueType

        //etc.
}

А вот как я пытаюсь разобрать его :

fun fromJson(json: String): User {
    val builder = GsonBuilder()
    builder.setPrettyPrinting()

    return builder.create().fromJson(json, User::class.java)
}

Расширена функция from Json, чтобы убедиться, что она застряла: create () все еще работает, из Json () не

Также Я знаю, что файл JSON правильный и не содержит пропущенных значений или нулей.

Для проверки:

{
"mac": "00-80-41-ae-fd-b1",
"values": 
[
    {
    "mac": "ab-cd-ef-98-76-13",
    "timestamp": "2012-04-23T18:25:43",
    "value": 68,
    "valuetype": "HR"
    },
    {
    "mac": "ab-cd-ef-98-76-13",
    "timestamp": "2012-04-23T18:35:43",
    "value": 65,
    "valuetype": "HR"
    }
]
}

Редактировать : для уточнения как к тому, что я имею в виду, когда мой код застревает. В целях отладки я изменил свою функцию с Json на следующую:

fun fromJson(json: String): User {
    val builder = GsonBuilder()
    builder.setPrettyPrinting()

    println("json received")
    val gson = builder.create()
    println("GSON created")
    val user = gson.fromJson(json, User::class.java)
    println("user created")

    return user
}

Моя консоль читает

json получен GSON создан

Значение "пользователь создан" не печатается, поэтому gson.from Json -call никогда не возвращает

Ответы [ 3 ]

0 голосов
/ 27 января 2020

Похоже, исправление состояло в том, чтобы избавиться от функций-получателей в классе измерений или задать поля в частном классе измерений.

Я скопировал / вставил код бара, и это сработало. Так что шаг за шагом пытались поменять местами мой код. После обмена в моем классе измерений я получил следующее исключение:

java .lang.ClassFormatError: дублирующееся имя метода "getDeviceMa c" с подписью "() L java. lang.String;» в файле класса jsonStuff / Measurement

Провел некоторые эксперименты и исследования только для того, чтобы обнаружить, что если поля Measurement не являются частными, но все еще имеют явно объявленные функции-получатели, они распознаются как дублирующие функции, в основном убивая приложение

0 голосов
/ 28 января 2020

Я бы предложил, если вы можете, использовать классы данных , а также удалить методы получения и Comparable. Кроме того, это одно из отличий примеров ответов, которые некоторые пользователи дали вам здесь.

0 голосов
/ 27 января 2020

Не уверен, что вы имеете в виду, застряв, но похоже, что это работает:

import com.google.gson.*
import com.google.gson.annotations.*

data class User(@SerializedName("mac") val phoneMac: String, @SerializedName("values") val measurements: MutableSet<Measurement>)

enum class ValueType{
    HR
}

data class Measurement (@SerializedName("mac") val deviceMac: String, val timestamp: String, val value: Double, val valuetype: ValueType)

fun fromJson(json: String): User {
    val builder = GsonBuilder()
    builder.setPrettyPrinting()

    return builder.create().fromJson(json, User::class.java)
}

fun main() {
    println(fromJson("""
        {
        "mac": "00-80-41-ae-fd-b1",
        "values": 
        [
            {
            "mac": "ab-cd-ef-98-76-13",
            "timestamp": "2012-04-23T18:25:43",
            "value": 68,
            "valuetype": "HR"
            },
            {
            "mac": "ab-cd-ef-98-76-13",
            "timestamp": "2012-04-23T18:35:43",
            "value": 65,
            "valuetype": "HR"
            }
        ]
        }
    """.trimIndent()))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...