我在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 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-和内部阶级
我浏览了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
您观察到的是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: 我得到了一个例外: 有什么想法吗?我是格森的新手。