当我将一个内部对象传递给Kotlin中的Gson()。toJson(object)时,为什么json字符串为null?

时间:2017-11-17 02:41:21

标签: android kotlin gson

我在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 个答案:

答案 0 :(得分:2)

我已经浏览了Gson Library并发现了以下代码

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

isAnonymousOrLocal(clazz)正在为true返回WiFiDefA,并且该方法clazz.isLocalClass()内部返回true

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

正如我尝试使用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"}

我们无法在方法范围内创建类。如果需要,可以将Nested and Inner Classes类创建为嵌套类。

https://kotlinlang.org/docs/reference/nested-classes.html#nested-and-inner-classes