为什么json字符串为空时,我将一个内部对象传递给Gson()。toJson(object)in Kotlin?
我使用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) }
我已经通过Gson库,发现下面的代码
if (isAnonymousOrLocal(clazz)) { return true; }
isAnonymousOrLocal(clazz)
对WiFiDefA
返回true
,并在该方法内clazz.isLocalClass()
返回true
但是对于WiFiDefB
,这些函数返回false。
欲了解更多信息,请访问下面的链接
你所观察到的是Gson的一个已知限制:它不会序列化匿名或本地类。 这就是为什么Gson代码明确拒绝序列化onCreate
方法中定义的类WiFiDefA
(这是通过调试Gson代码观察到的@SangeetSuresh)。
正如您在https://github.com/google/gson/issues/298中看到的,有人提出了一个问题来改变这个问题,并允许匿名和本地class级的序列化,但问题在一年多前没有明确原因。
正如我已经尝试使用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-and-inner-classes