如何在Ktor中接收JSON对象? [英] How to receive JSON object in Ktor?

查看:588
本文介绍了如何在Ktor中接收JSON对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经定义了数据类,配置了gson并创建了rout来处理发布请求,如下所示:

I have data class defined, configured gson and created rout to handle post request as follows:

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)

在POST请求中发送以下JSON

the following JSON is sent in POST request

{
"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()似乎无法产生预期的结果.

Reading data from call.request.receiveChannel() does show correct JSON. So I am receiving the data but call.receive() does not seem to produce expected results.

手动获取JSON,并尝试按如下所示创建PurchaseOrder:

Got JSON manually and tried to create PurchaseOrder as follows bu no luck:

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"中.

The problem is that you have wrapped your json in "PurchaseOrder".

如果您改为发布此信息:

If you post this instead:

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

它正确接收以下内容:

purchase order: PurchaseOrder(buyer=buyer a, seller=seller A, poNumber=PO1234, date=27-Jun-2018, vendorReference=Ref1234)

如果您想保留json请求,则有2个选项.

If you want to keep the json request as is, you have 2 options.

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

像这样的包装器类:

class PurchaseOrderWrapper( val purchaseOrder: PurchaseOrder )

class PurchaseOrderWrapper( val purchaseOrder: PurchaseOrder )

然后您将收到如下信息: call.receive<PurchaseOrderWrapper>().purchaseOrder

Then you can receive like this: call.receive<PurchaseOrderWrapper>().purchaseOrder

这篇关于如何在Ktor中接收JSON对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆