Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:GSON fromJson不';不计算_Json_Kotlin_Gson - Fatal编程技术网

Kotlin:GSON fromJson不';不计算

Kotlin:GSON fromJson不';不计算,json,kotlin,gson,Json,Kotlin,Gson,我正在成功地接收一个JSON对象作为请求,并将其传递给我的解析器。代码一直运行到我调用fromJson,然后被卡住。我做错了什么 下面是相应的类: class User(@SerializedName("mac") private val phoneMac: String) : Comparable<User> { @SerializedName("values") private val measurements: MutableSet<Measuremen

我正在成功地接收一个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.
}
将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"
    }
]
}
编辑:澄清我的代码被卡住的意思 出于调试目的,我将fromJson函数更改为如下所示:

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.fromJson-call永远不会返回

不确定卡住是什么意思,但这似乎有效:

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()))
}
导入com.google.gson* 导入com.google.gson.annotations* 数据类用户(@SerializedName(“mac”)val phoneMac:String,@SerializedName(“values”)val度量值:MutableSet) 枚举类ValueType{ 人力资源 } 数据类度量(@SerializedName(“mac”)val设备mac:String,val时间戳:String,val值:Double,val值类型:valuetype) fun fromJson(json:String):用户{ val builder=GsonBuilder() builder.setPrettyPrinting() 返回builder.create().fromJson(json,User::class.java) } 主要内容(){ println(fromJson(“”) { “mac”:“00-80-41-ae-fd-b1”, “价值观”: [ { “mac”:“ab-cd-ef-98-76-13”, “时间戳”:“2012-04-23T18:25:43”, “价值”:68, “valuetype”:“HR” }, { “mac”:“ab-cd-ef-98-76-13”, “时间戳”:“2012-04-23T18:35:43”, “价值”:65, “valuetype”:“HR” } ] } “.trimIndent())) }
不确定你说的卡住是什么意思,但这似乎是可行的:

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()))
}
导入com.google.gson* 导入com.google.gson.annotations* 数据类用户(@SerializedName(“mac”)val phoneMac:String,@SerializedName(“values”)val度量值:MutableSet) 枚举类ValueType{ 人力资源 } 数据类度量(@SerializedName(“mac”)val设备mac:String,val时间戳:String,val值:Double,val值类型:valuetype) fun fromJson(json:String):用户{ val builder=GsonBuilder() builder.setPrettyPrinting() 返回builder.create().fromJson(json,User::class.java) } 主要内容(){ println(fromJson(“”) { “mac”:“00-80-41-ae-fd-b1”, “价值观”: [ { “mac”:“ab-cd-ef-98-76-13”, “时间戳”:“2012-04-23T18:25:43”, “价值”:68, “valuetype”:“HR” }, { “mac”:“ab-cd-ef-98-76-13”, “时间戳”:“2012-04-23T18:35:43”, “价值”:65, “valuetype”:“HR” } ] } “.trimIndent())) }
看来修复方法是去掉度量类中的getter函数或将度量类中的字段设置为private

我复制/粘贴了barsju的代码,它成功了。所以我一步一步地尝试交换我的代码片段。在Measurements类中交换后,我得到以下异常:

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


做了一些实验和研究,结果发现如果测量领域不是私有的,但仍然有明确声明的getter函数,那么它们被认为是重复函数,基本上停止了应用程序

看来修复方法是去掉度量类中的getter函数或将度量类中的字段设置为private

我复制/粘贴了barsju的代码,它成功了。所以我一步一步地尝试交换我的代码片段。在Measurements类中交换后,我得到以下异常:

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


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

我建议,如果可以的话,使用并删除getter和类似的函数。
这也是一些用户在这里给出的示例答案的不同之处之一。

如果可以的话,我建议您使用并删除getter和可比getter。
这也是一些用户在这里给出的示例答案的差异之一。

我编辑了我的原始问题,以澄清我所说的卡住是什么意思。此外,我还尝试更改我使用的json字符串,使其不使用任何空格、换行符或类似的内容(以适应trimIndent(),这对我来说没有任何改变),但没有任何效果。但是,我在清理json字符串时出了点差错,这导致了由于json格式不正确而导致的异常,因此至少我可以100%确认正在调用gson.fromJson()。我尝试复制/粘贴代码以进行测试。它是有效的,但我看不出它与我已经在做的有什么不同。我编辑了我的原始问题,以澄清我所说的卡住是什么意思。此外,我还尝试更改我使用的json字符串,使其不使用任何空格、换行符或类似的内容(以适应trimIndent(),这对我来说没有任何改变),但没有任何效果。但是,我在清理json字符串时出了点差错,这导致了由于json格式不正确而导致的异常,因此至少我可以100%确认正在调用gson.fromJson()。我尝试复制/粘贴代码以进行测试。它可以工作,但我看不出它与我已经在做的有什么不同是的,构造函数中的公共val将编译成一个字段,getter将产生与代码完全相同的结果。在科特林
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()))
}