gpt4 book ai didi

json - 如何将自定义编码器添加到 akka http?

转载 作者:行者123 更新时间:2023-12-04 14:06:48 24 4
gpt4 key购买 nike

作为 scala 和 akka-http 的初学者,我正在尝试加入序列化 aka 编码过程。

该项目使用 akka@2.5.2 和 akka-http@10.0.10"。此外,它还包含 akka-http-spray-json 依赖项。

在代码库中,我们使用 Java.Util.Currency (它可能已被弃用,这并不重要,因为我仍然想知道如何添加自定义编码器。)

鉴于此示例 Controller :

def getCurrencyExample: Route = {
path("currencyExample") {
val currency: Currency = Currency.getInstance("EUR")
val code: String = currency.getCurrencyCode

val shouldBeFormated = collection.immutable.HashMap(
"currencyCode" -> code,
"currencyObject" -> currency
)

complete(shouldBeFormated)
}
}

我得到这样的响应,其中货币对象变为空:
 {
currencyObject: { },
currencyCode: "EUR",
}

我期待这样的事情:
 {
currencyObject: "EUR",
currencyCode: "EUR",
}
currency对象应转换为 JSON 字符串。而且由于我不想手动转换每个响应,我想挂入编码过程并在后台完成。

我只想为 Java.Util.Currency 添加自定义 marhaller对象,甚至 reading up on the docs我非常不确定如何继续。
描述了多种方法,我不确定哪种适合我的需要,或者从哪里开始。

我尝试创建自己的 CurrencyJsonProtocol :
package com.foo.api.marshallers

import java.util.Currency

import spray.json.{DefaultJsonProtocol, JsString, JsValue, RootJsonFormat}

object CurrencyJsonProtocol extends DefaultJsonProtocol {

implicit object CurrencyJsonFormat extends RootJsonFormat[Currency] {
override def read(json: JsValue): Currency = {
Currency.getInstance(json.toString)
}

override def write(obj: Currency): JsValue = {
JsString(obj.getCurrencyCode)
}
}

}

然而仅仅存在文件就破坏了我的项目:
[error] RouteDefinitons.scala:90:16: type mismatch;
[error] found : scala.collection.immutable.HashMap[String,java.io.Serializable]
[error] required: akka.http.scaladsl.marshalling.ToResponseMarshallable
[error] complete(shouldBeFormated)
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

我不知道为什么。 (由于我的包名被称为 marshaller ,它崩溃了。这完全破坏了项目的编译。

最佳答案

据我所知,你拥有所有的部分,你只需要把它们放在一起。

Spray json 提供了对常见类型的编码的支持,例如 Int、String、Boolean、List、Map 等,但是它不知道如何编码 'Currency'。为了解决这个问题,您为“货币”对象创建了一个自定义编码器。您只需要将其插入正确的位置即可。您所要做的就是从您的 CurrencyJsonProtocol 导入编码器。进入您的 Controller ,如下所示:
import CurrencyJsonProtocol._
还要确保您还有以下导入:
import spray.httpx.SprayJsonSupport._
import spray.json.DefaultJsonProtocol._

并且spray-json 应该会自动选择它。

要了解它的工作原理,您需要了解 implicits在斯卡拉。虽然当你像我一样来自 Java 世界时它看起来很神奇,但我可以向你保证它不是。

关于json - 如何将自定义编码器添加到 akka http?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49771699/

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