【问题标题】:Gson toJson returning string of JSON instead of JSON ObjectGson toJson 返回 JSON 字符串而不是 JSON 对象
【发布时间】: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 做同样的事情时,它也是一个对象。在这种情况下,它作为字符串发送。

标签: android json kotlin


【解决方案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 对象。

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多