gpt4 book ai didi

kotlin - 如何在 Ktor 中接收 JSON 对象?

转载 作者:行者123 更新时间:2023-12-02 03:29:53 25 4
gpt4 key购买 nike

我定义了数据类,配置了 gson 并创建了路由来处理 post 请求,如下所示:

data class PurchaseOrder(val buyer: String, val seller: String, 
val poNumber: String, val date: String,
val vendorReference: String)

install(ContentNegotiation) {
gson {
setDateFormat(DateFormat.LONG)
setPrettyPrinting()
}


post("/purchaseOrder"){
val po = call.receive<PurchaseOrder>()
println("purchase order: ${po.toString()}")
call.respondText("post received", contentType =
ContentType.Text.Plain)

以下 JSON 在 POST 请求中发送

{
"PurchaseOrder" : {
"buyer": "buyer a",
"seller": "seller A",
"poNumber": "PO1234",
"date": "27-Jun-2018",
"vendorReference": "Ref1234"
}
}

输出显示所有空值。

purchase order: PurchaseOrder(buyer=null, seller=null, poNumber=null, 
date=null, vendorReference=null)

从 call.request.receiveChannel() 读取数据确实显示了正确的 JSON。所以我正在接收数据,但 call.receive() 似乎没有产生预期的结果。

手动获取 JSON 并尝试创建 PurchaseOrder,如下所示,但没有成功:

val channel = call.request.receiveChannel()
val ba = ByteArray(channel.availableForRead)
channel.readFully(ba)
val s = ba.toString(Charset.defaultCharset())

println(s) // prints JSON

val gson = Gson()
val po = gson.fromJson(s, PurchaseOrder::class.java)

println("buyer = ${po.buyer}" //prints null

最佳答案

问题是您已将 json 包装在 "PurchaseOrder" 中。

如果您发布此内容:

{
"buyer": "buyer a",
"seller": "seller A",
"poNumber": "PO1234",
"date": "27-Jun-2018",
"vendorReference": "Ref1234"
}

它正确接收以下内容:

采购订单:PurchaseOrder(buyer=buyer a, seller=seller A, poNumber=PO1234, date=27-Jun-2018,vendorReference=Ref1234)

如果您想保持 json 请求不变,您有 2 个选择。

  1. 自定义 gson 序列化程序,期望将请求包装在 PurchaseOrder 中。

  2. 像这样的包装类:

class PurchaseOrderWrapper(
val purchaseOrder: PurchaseOrder
)

然后你可以这样接收:

call.receive<PurchaseOrderWrapper>().purchaseOrder

关于kotlin - 如何在 Ktor 中接收 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51449280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com