我在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)
}
答案 0 :(得分:2)
我已经浏览了Gson Library并发现了以下代码
if (isAnonymousOrLocal(clazz)) {
return true;
}
isAnonymousOrLocal(clazz)
正在为true
返回WiFiDefA
,并且该方法clazz.isLocalClass()
内部返回true
但是对于WiFiDefB
,这些函数返回false。
欲了解更多信息,请访问以下链接
答案 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