Circe Unmarshall HttpResponse
Circe Unmarshall HttpResponse
我正在尝试向领事询问健康 services.The 回复是:
HttpResponse(200 OK,List(X-Consul-Index: 3471242, X-Consul-Knownleader: true, X-Consul-Lastcontact: 0, Date: Fri, 02 Mar 2018 16:06:08 GMT),HttpEntity.Strict(application/json,[{"Node":{"Node":"ci-content-1","Address":"10.45.200.14","TaggedAddresses":{"wan":"10.45.200.14"},"CreateIndex":2708577,"ModifyIndex":3470978},"Service":{"ID":"de62bdcb8e37:varnish_2:6085","Service":"shop-varnish-6085","Tags":null,"Address":"10.45.200.14","Port":33889,"EnableTagOverride":false,"CreateIndex":3313055,"ModifyIndex":3313055},"Checks":[{"Node":"ci-content-1","CheckID":"serfHealth","Name":"Serf Health Status","Status":"passing","Notes":"","Output":"Agent alive and reachable","ServiceID":"","ServiceName":"","CreateIndex":2708577,"ModifyIndex":3451134}]},{"Node":{"Node":"ci-content-2","Address":"10.45.200.18","TaggedAddresses":{"wan":"10.45.200.18"},"CreateIndex":2158463,"ModifyIndex":3471241},"Service":{"ID":"f89a94600d4c:varnish_1:6085","Service":"shop-varnish-6085","Tags":null,"Address":"10.45.200.18","Port":33622,"EnableTagOverride":false,"CreateIndex":3313064,"ModifyIndex":3313064},"Checks":[{"Node":"toom-ci-content-2","CheckID":"serfHealth","Name":"Serf Health Status","Status":"passing","Notes":"","Output":"Agent alive and reachable","ServiceID":"","ServiceName":"","CreateIndex":2158464,"ModifyIndex":3297480}]}]
class 定义是:
final case class TaggedAddresses (
wan: String)
final case class Node (
node: String,
address: String,
taggedAddresses: TaggedAddresses,
createIndex: Int,
modifyIndex: Int
)
final case class Service (
id: String,
service: String,
tags: String,
addresses: String,
port: Int,
enableTagOverride: String,
createIndex: Int,
modifyIndex: Int
)
final case class Check (
node: String,
checkId:String,
name: String,
status: String,
notes: String,
output: String,
serviceId: String,
serviceName:String,
createIndex: Int,
modifyIndex: Int
)
final case class NodeInfo(
node: Node,
service: Service,
checkList: List[Check]
)
package object VarnishInformation {}
然后我尝试解组:
val request = HttpRequest(method = HttpMethods.GET, uri = consulUrl)
val response = Await.result(Http().singleRequest(request), 10.seconds)
log.info("Entity: " + response.httpMessage)
val entries = Unmarshal(response).to[List[NodeInfo]]
并得到以下错误:
处理请求时出错:'Attempt to decode value on failed cursor: DownField(node),DownArray'。完成 500 Internal Server Error 响应。要更改默认异常处理行为,请提供自定义 ExceptionHandler。
我看不到失败,其他人可以做吗?
简短的回答:假设您已准备好所有必需的解码器和编码器,您应该按如下方式简单地修复您的案例 class:
case class Node (
Node: String,
Address: String,
TaggedAddresses: TaggedAddresses,
CreateIndex: Int,
ModifyIndex: Int
)
也就是说,您必须完全使用标签名称,因为它们出现在您的 JSON.
长答案:如果我从你的对象中取出相关的 JSON 如下:
val jsonString =
"""
{
"Node":{
"Node":"ci-content-1",
"Address":"10.45.200.14",
"TaggedAddresses":{
"wan":"10.45.200.14"
},
"CreateIndex":2708577,
"ModifyIndex":3470978
},
...
"""
然后下面的代码将产生 Right(Node(ci-content-1,10.45.200.14,TaggedAddresses(10.45.200.14),2708577,3470978))
,当使用上述情况 class 的更正版本时:
def myParse(jsonString: String) = {
val res = parse(jsonString) match {
case Right(json) => {
val cursor = json.hcursor
cursor.get[Node]("Node")
}
case _ => Left("Wrong JSON!")
}
println(res)
}
否则,我也会遇到与您描述的相同的错误。
我正在尝试向领事询问健康 services.The 回复是:
HttpResponse(200 OK,List(X-Consul-Index: 3471242, X-Consul-Knownleader: true, X-Consul-Lastcontact: 0, Date: Fri, 02 Mar 2018 16:06:08 GMT),HttpEntity.Strict(application/json,[{"Node":{"Node":"ci-content-1","Address":"10.45.200.14","TaggedAddresses":{"wan":"10.45.200.14"},"CreateIndex":2708577,"ModifyIndex":3470978},"Service":{"ID":"de62bdcb8e37:varnish_2:6085","Service":"shop-varnish-6085","Tags":null,"Address":"10.45.200.14","Port":33889,"EnableTagOverride":false,"CreateIndex":3313055,"ModifyIndex":3313055},"Checks":[{"Node":"ci-content-1","CheckID":"serfHealth","Name":"Serf Health Status","Status":"passing","Notes":"","Output":"Agent alive and reachable","ServiceID":"","ServiceName":"","CreateIndex":2708577,"ModifyIndex":3451134}]},{"Node":{"Node":"ci-content-2","Address":"10.45.200.18","TaggedAddresses":{"wan":"10.45.200.18"},"CreateIndex":2158463,"ModifyIndex":3471241},"Service":{"ID":"f89a94600d4c:varnish_1:6085","Service":"shop-varnish-6085","Tags":null,"Address":"10.45.200.18","Port":33622,"EnableTagOverride":false,"CreateIndex":3313064,"ModifyIndex":3313064},"Checks":[{"Node":"toom-ci-content-2","CheckID":"serfHealth","Name":"Serf Health Status","Status":"passing","Notes":"","Output":"Agent alive and reachable","ServiceID":"","ServiceName":"","CreateIndex":2158464,"ModifyIndex":3297480}]}]
class 定义是:
final case class TaggedAddresses (
wan: String)
final case class Node (
node: String,
address: String,
taggedAddresses: TaggedAddresses,
createIndex: Int,
modifyIndex: Int
)
final case class Service (
id: String,
service: String,
tags: String,
addresses: String,
port: Int,
enableTagOverride: String,
createIndex: Int,
modifyIndex: Int
)
final case class Check (
node: String,
checkId:String,
name: String,
status: String,
notes: String,
output: String,
serviceId: String,
serviceName:String,
createIndex: Int,
modifyIndex: Int
)
final case class NodeInfo(
node: Node,
service: Service,
checkList: List[Check]
)
package object VarnishInformation {}
然后我尝试解组:
val request = HttpRequest(method = HttpMethods.GET, uri = consulUrl)
val response = Await.result(Http().singleRequest(request), 10.seconds)
log.info("Entity: " + response.httpMessage)
val entries = Unmarshal(response).to[List[NodeInfo]]
并得到以下错误:
处理请求时出错:'Attempt to decode value on failed cursor: DownField(node),DownArray'。完成 500 Internal Server Error 响应。要更改默认异常处理行为,请提供自定义 ExceptionHandler。
我看不到失败,其他人可以做吗?
简短的回答:假设您已准备好所有必需的解码器和编码器,您应该按如下方式简单地修复您的案例 class:
case class Node (
Node: String,
Address: String,
TaggedAddresses: TaggedAddresses,
CreateIndex: Int,
ModifyIndex: Int
)
也就是说,您必须完全使用标签名称,因为它们出现在您的 JSON.
长答案:如果我从你的对象中取出相关的 JSON 如下:
val jsonString =
"""
{
"Node":{
"Node":"ci-content-1",
"Address":"10.45.200.14",
"TaggedAddresses":{
"wan":"10.45.200.14"
},
"CreateIndex":2708577,
"ModifyIndex":3470978
},
...
"""
然后下面的代码将产生 Right(Node(ci-content-1,10.45.200.14,TaggedAddresses(10.45.200.14),2708577,3470978))
,当使用上述情况 class 的更正版本时:
def myParse(jsonString: String) = {
val res = parse(jsonString) match {
case Right(json) => {
val cursor = json.hcursor
cursor.get[Node]("Node")
}
case _ => Left("Wrong JSON!")
}
println(res)
}
否则,我也会遇到与您描述的相同的错误。