当前位置: 首页 > 知识库问答 >
问题:

为什么我将内部对象传递给Gson()时json字符串为空。Kotlin中的toJson(对象)?

上官扬
2023-03-14

我在Kotlin中使用Gson将对象转换为json字符串。

var json2可以返回正确的结果,但是var json1返回null,为什么?

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import bll.SettingManage
import info.dodata.mirror.R
import model.MSetting
import com.google.gson.Gson
import utility.PreferenceTool

class UIMain : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)

        data class WiFiDefA(val Name:String, val Status: String)

        var  aWiFiDefA=WiFiDefA("a","b")
        var  json1=Gson().toJson(aWiFiDefA)

        var aWiFiDefB=WiFiDefB("c","d")
        var json2=Gson().toJson(aWiFiDefB)   

    }

    data class WiFiDefB(val Name:String, val Status: String)

}

共有3个答案

董凡
2023-03-14

正如我尝试使用GSON lib一样,我已经在onCreate()方法之外声明了这两个类。

如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val  aWiFiDefA=WiFiDefA("a","b")
    val json1=Gson().toJson(aWiFiDefA)

    Log.d("json1",json1.toString())
    var aWiFiDefB=WiFiDefB("c","d")
    var json2= Gson().toJson(aWiFiDefB)
    Log.d("json2",json2.toString())
}
data class WiFiDefA(val Name:String, val Status: String)
data class WiFiDefB(val Name:String, val Status: String)

这给了我一个你需要的输出。输出:

11-17 11:58:50.448 27978-27978/? D/json1: {"Name":"a","Status":"b"}
11-17 11:58:50.452 27978-27978/? D/json2: {"Name":"c","Status":"d"}

但当我尝试你的代码时,得到如下输出:

11-17 11:58:01.312 27584-27584/? D/json1: null
11-17 11:58:01.320 27584-27584/? D/json2: {"Name":"c","Status":"d"}

我们不能在方法范围内创建类。如果需要,您可以创建嵌套类和内部类作为嵌套类。

https://kotlinlang.org/docs/reference/nested-classes.html#nested-和内部阶级

江飞章
2023-03-14

我浏览了Gson库,发现以下代码

if (isAnonymousOrLocal(clazz)) {
      return true;
    }

isAnonymousOrLocal(clazz)正在为WiFiDefA和该方法内部返回true。isLocalClass()正在返回true

但是对于wifideb,这些函数返回false。

欲了解更多信息,请访问以下链接

https://github.com/google/gson/blob/0636635cbffa08157bdbd558b1212e4d806474eb/gson/src/main/java/com/google/gson/internal/Excluder.java

长孙昀
2023-03-14

您观察到的是Gson的一个已知限制:它不会序列化匿名或本地类。这就是为什么Gson代码明确拒绝序列化在方法onCreate中定义的类WiFiDefA(这是@SangeetSuresh通过调试Gson代码观察到的)。

正如您在https://github.com/google/gson/issues/298中看到的,提出了一个问题来改变这种情况,并允许匿名和本地类的序列化,但是这个问题在一年多前就被关闭了,没有明确的原因。

 类似资料:
  • 我在行中发现了空字符串,并通过调试将其转换为。在google了一段时间后,我看到Grails中有一个特性,可以将web表单中的空字符串转换为空字符串以持久化,可以通过config.groovy中的配置禁用该特性。但我不认为斯波克UT是这样的。我试过了,但不像我想的那样有效。 我想知道为什么空字符串被转换为null作为传递给构造函数的参数?提前谢了。

  • 我在编写从JSON字符串到对象列表的转换代码时遇到了Kotlin的问题。 类型不匹配。必需:键入!找到:()→单位 那么有没有解决办法让它为科特林工作呢?

  • 我正在使用GoogleGSON2.4版本,我已经将文件gson-2.4.jar添加到我的Android项目中的Android studio中的libs文件夹下。代码生成成功。 我的代码如下 json始终为空值。 我的预期结果为 我该怎么修好它?谢谢

  • 我正在从Reddit API检索评论。该模型是线程化的,这样每个评论都可以在内部有一个评论列表,名为回复。下面是一个JSON响应的示例: 这是我如何用POJO建模的。上面的回复将被视为评论列表。 请注意底层CommentData POJO如何引用另一个名为“回复”的CommentList。 这个模型一直工作到GSON到达最后一个没有回复的子CommentData。API提供的不是空字符串,而是空字

  • 问题内容: 我有以下内容,但它不起作用,我在stackoverflow上的某个地方读到了它的工作原理,但我似乎无法使其工作..它出错了……我在做错什么吗? 如果我确实传递了这样的数据-它可以工作-所以我知道我的服务正在工作 问题答案: 我相信代码将在对象上调用.value或.toString(),然后通过网络传递。您想传递JSON。 因此,包括JSON JavaScript库 http://www

  • 我试图使用GSON解析一些非常简单的JSON。这是我的代码: 以下是从url返回的JSON: 我得到了一个例外: 有什么想法吗?我是格森的新手。