我正在作为请求成功地接收一个JSON对象,并将它传递给我的解析器。代码会一直运行,直到我调用fromJson,然后被卡住。我做错了什么?
下面是相应的类:
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)
}扩展了fromJson函数,以确保它被卡住了: create()仍然工作,fromJson()没有
另外,我知道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"
}
]
}编辑:为了澄清我的代码为调试目的而陷入困境的含义,我将函数更改为如下所示:
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调用永远不会返回。
发布于 2020-01-27 16:13:28
修复方法似乎是消除测量类中的getter函数,或者在度量衡类私有中设置字段。
我复制/粘贴了barsju的代码,它起作用了。因此,一步一步地尝试交换我的代码片段。在我的测量-课程交换之后,我得到了以下例外:
java.lang.ClassFormatError:类文件jsonStuff/getDeviceMac中带有签名"()Ljava.lang.String;“的重复方法名"getDeviceMac”
做了一些实验和研究才发现,如果测量字段不是私有的,但仍然有显式声明的getter函数,则它们被确认为重复函数,基本上扼杀了应用程序
发布于 2020-01-27 14:32:18
不知道你说的“卡住”是什么意思,但这似乎奏效了:
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()))
}发布于 2020-01-28 09:31:11
如果可以的话,我建议使用数据类,并删除getter和可比较的getter。这也是这个例子的一个不同之处,一些用户在这里给了你答案。
https://stackoverflow.com/questions/59932663
复制相似问题