为什么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。

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

https://github.com/google/gson/blob/0636635cbf​​fa08157bdbd558b1212e4d806474eb/gson/src/main/java/com/google/gson/internal/Excluder.java

你所观察到的是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