Gson toJson 返回 JSON 字符串而不是 JSON 对象

Posted

技术标签:

【中文标题】Gson toJson 返回 JSON 字符串而不是 JSON 对象【英文标题】:Gson toJson returning string of JSON instead of JSON Object 【发布时间】:2021-11-03 16:25:56 【问题描述】:

我与 toJson 一起使用的类

class LoadUserDTO: Serializable 
    @SerializedName("userGuid")
    var userGuid: String? = null

    @SerializedName("userToken")
    var userToken: String? = null

    constructor(userGuid: String, userToken: String) 
        this.userGuid = userGuid
        this.userToken = userToken
    

以及其余的使用:

val payload = LoadUserDTO(userGuid = user.guid!!, userToken = user.token!!)

val jsonPayload = Gson().toJson(payload)

this.socketService.socket.emit(EndpointsEnum.AppLoadUser, jsonPayload)

jsonPayload 应该是一个 JSON 对象。相反,整个事情是一个应该是 JSON 对象的字符串:

""userGuid":"...","userToken":"...""

当服务器接收到它时,它不会像 Web UI 或 Swift App 发送的那样接收 JSON 对象,而是只是一个字符串,而不是转换为 JSON 对象。

【问题讨论】:

你能记录下payload包含的内容吗? JSON 对象是什么意思?与当前发生的情况相比,您的预期输出是多少?你怎么知道它正在发送一个字符串? @DevWithZachary 我可以在 API 端点上设置断点。数据是一个字符串,当它应该是一个对象时。当我通过 Web App 做同样的事情时,它是一个对象,当我从 ios App 做同样的事情时,它也是一个对象。在这种情况下,它作为字符串发送。 【参考方案1】:

试试这个,

var jsonString = """"id":1,"description":"Test"""";
var testModel = gson.fromJson(jsonString, TestModel::class.java)

【讨论】:

我不想创建 Java 对象。我想要一个通过网络发送的实际 JSON 对象,而不是 JSON 对象的字符串。【参考方案2】:

根据您的要求而不是使用Gson,您可以使用 String.format 通过一行代码来实现这一点-

   // val payload = LoadUserDTO(userGuid = user.guid!!, userToken = user.token!!)
   // val jsonPayload = Gson().toJson(payload)
     val jsonPayload = String.format("\"\"userGuid\": \"%s\"," + "\"userToken\": \"%s\"" + "\"",user.guid,user.token)
   // Log.d("ZI",jsonPayload)

输出示例

""userGuid": "1234","userToken": "token000""

您可以在格式化字符串时删除: 之后的space

       val jsonPayload = String.format("\"\"userGuid\":\"%s\"," + "\"userToken\":\"%s\"" + "\"",user.guid,user.token)

输出-

""userGuid":"1234","userToken":"token000""

【讨论】:

我有很多 DTO 需要设置为对象。我绝对不想处理字符串插值。【参考方案3】:

我还不完全明白为什么,但是这个 SO Question 给了我答案:

Send JSON data from in socket.io from android

val jsonPayload = Gson().toJson(payload)

val jsonObj = JSONObject(jsonPayload)

this.socketService.socket.emit(EndpointsEnum.AppLoadUser, jsonObj)

在创建jsonObj 之后,服务器现在有一个可以使用的格式正确的 JSON 对象。

【讨论】:

以上是关于Gson toJson 返回 JSON 字符串而不是 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

gson.toJson() 抛出 ***Error

AJAX,JSON,GSON

使用 gson 反序列化 json 字符串

Gson toJson(),奇怪的行为(产生空的 json)

Konlin中的Gson toJson和ArrayList

Gson.toJson 返回 null [ProGuard 问题]