首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin: GSON fromJson不计算

Kotlin: GSON fromJson不计算
EN

Stack Overflow用户
提问于 2020-01-27 14:00:19
回答 3查看 622关注 0票数 1

我正在作为请求成功地接收一个JSON对象,并将它传递给我的解析器。代码会一直运行,直到我调用fromJson,然后被卡住。我做错了什么?

下面是相应的类:

代码语言:javascript
复制
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.
}

指的是这个类:

代码语言:javascript
复制
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.
}

下面是我试图解析它的方法:

代码语言:javascript
复制
fun fromJson(json: String): User {
    val builder = GsonBuilder()
    builder.setPrettyPrinting()

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

扩展了fromJson函数,以确保它被卡住了: create()仍然工作,fromJson()没有

另外,我知道JSON文件是正确的,并且不包含缺少的值或空值。

供核查:

代码语言:javascript
复制
{
"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"
    }
]
}

编辑:为了澄清我的代码为调试目的而陷入困境的含义,我将函数更改为如下所示:

代码语言:javascript
复制
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 user调用永远不会返回。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-27 16:13:28

修复方法似乎是消除测量类中的getter函数,或者在度量衡类私有中设置字段。

我复制/粘贴了barsju的代码,它起作用了。因此,一步一步地尝试交换我的代码片段。在我的测量-课程交换之后,我得到了以下例外:

java.lang.ClassFormatError:类文件jsonStuff/getDeviceMac中带有签名"()Ljava.lang.String;“的重复方法名"getDeviceMac”

做了一些实验和研究才发现,如果测量字段不是私有的,但仍然有显式声明的getter函数,则它们被确认为重复函数,基本上扼杀了应用程序

票数 0
EN

Stack Overflow用户

发布于 2020-01-27 14:32:18

不知道你说的“卡住”是什么意思,但这似乎奏效了:

代码语言:javascript
复制
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()))
}
票数 0
EN

Stack Overflow用户

发布于 2020-01-28 09:31:11

如果可以的话,我建议使用数据类,并删除getter和可比较的getter。这也是这个例子的一个不同之处,一些用户在这里给了你答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59932663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档