Kotlin用新的行分隔符解析json数组



我在Kotlin应用程序中使用OKHttpClient将文件发布到得到处理的API。当进程运行时,API将发送回消息以保持连接活动,直到结果完成。因此,我收到以下内容(这是使用println()打印到控制台的内容)

{"status":"IN_PROGRESS","transcript":null,"error":null}
{"status":"IN_PROGRESS","transcript":null,"error":null}
{"status":"IN_PROGRESS","transcript":null,"error":null}
{"status":"DONE","transcript":"Hello, world.","error":null}

我认为是用一个新的行字符分隔,而不是逗号。

我弄清楚了如何通过执行以下操作来提取数据,但是是否有一种更技术上正确的方法来转换它?我得到了它的工作与此,但它似乎容易出错,我。


data class Status (status : String?, transcript : String?, error : String?)
val myClient = OkHttpClient ().newBuilder ().build ()
val myBody = MultipartBody.Builder ().build () // plus some stuff
val myRequest = Request.Builder ().url ("localhost:8090").method ("POST", myBody).build ()
val myResponse = myClient.newCall (myRequest).execute ()
val myString = myResponse.body?.string ()
val myJsonString = "[${myString!!.replace ("}", "},")}]".replace (",]", "]")
// Forces the response from "{key:value}{key:value}" 
// into a readable json format "[{key:value},{key:value},{key:value}]"
// but hoping there is a more technically sound way of doing this
val myTranscriptions = gson.fromJson (myJsonString, Array<Status>::class.java)

您的解决方案的另一种选择是在宽松模式下使用JsonReader。这允许解析不严格遵守规范的JSON,例如在您的情况下有多个顶级值。它还使解析的其他方面变得宽松,但对于您的用例来说,这可能是可以接受的。

然后您可以使用单个JsonReader封装响应流,重复调用Gson.fromJson并自己在列表中收集反序列化的对象。例如:

val gson = GsonBuilder().setLenient().create()
val myTranscriptions = myResponse.body!!.use {
val jsonReader = JsonReader(it.charStream())
jsonReader.isLenient = true
val transcriptions = mutableListOf<Status>()

while (jsonReader.peek() != JsonToken.END_DOCUMENT) {
transcriptions.add(gson.fromJson(jsonReader, Status::class.java))
}
transcriptions
}

但是,如果服务器不断地提供状态更新,直到处理完成,那么直接处理已解析的状态可能比在处理它们之前将它们全部收集到一个列表中更有意义。

最新更新