如何从 akka singleRequest 响应正文中自定义解组

如何解决如何从 akka singleRequest 响应正文中自定义解组

我从带有自定义主体的 singleRequest 中使用了一些数据,并且我尝试使用 Unmarshall 将其序列化为自定义 case 类,但它不起作用;身体反应是这样的:

{
    "teams": [
        {
            "id": "21312","name": "team1","color": "#4169E1","avatar": null,"members": [
                {
                    "user": {
                        "id": 12737636,"username": "user2","email": "user2@email.com","color": "#827718","profilePicture": null,"initials": "U2","role": 4,"custom_role": null,"last_active": "1613419183004","date_joined": "1612542647748","date_invited": "1612542548880"
                    },"invited_by": {
                        "id": 68732,"username": "user1","color": "#f8306d","email": "user1@email.com","initials": "U1","profilePicture": "https://attachments.clickup.com/profilePictures/image.jpg"
                    },"can_see_time_spent": true,"can_see_time_estimated": true,"can_see_points_estimated": true,"can_edit_tags": false
                },{
                    "user": {
                        "id": 12715129,"username": "user3","email": "user3@email.com","color": "#04a9f4","initials": "IM","last_active": "1613483780281","date_joined": "1611598611255","date_invited": "1611597360856"
                    },"invited_by": {
                        "id": 4371505,"username": "user34","email": "user34@email.com","initials": "U34","can_edit_tags": false
                }
            ]
        }
    ]
}

获取数据的代码:

val responseFuture = Http()
      .singleRequest(HttpRequest( method = GET,uri = "https://apiRest/api/v2/team" )
        .withHeaders(RawHeader("authorization","xxxxxxxxxxxx")))

我有这个案例类来序列化它:

    case class Invited_By (id: Long,username:Option[String],color : Option[String],email: Option[String],initials : Option[String],profilePicture: Option[String])
  case class User ( id: Long,username: Option[String],color: Option[String],profilePicture: Option[String],initials: Option[String],role: Option[Int],custom_role: Option[String],last_active: Option[String],date_joined: Option[String],date_invited: Option[String] )
  case class Member (user: User,invited_By: Invited_By,can_see_time_spent: Boolean,can_see_time_estimated:Boolean,can_see_points_estimated:Boolean,can_edit_tags:Boolean)
  case class Team (id : String,name: Option[String],avatar: Option[String],members: Seq[Member] )
  case class Teams( teams: Seq[Team] )

我试过这个;这不起作用:

import play.api.libs.json._
import play.api.libs.functional.syntax._

implicit val TeamsReads: Reads[Teams] = Json.reads[Teams]

    val responseFuture = Http()
      .singleRequest(HttpRequest( method = GET,"XXXXXXXXXXXX")))
      .flatMap{
        res =>
          Unmarshal(res).to[String]
            .map {
              data =>
                val jsValue:JsValue = Json.parse(data)
                val result: JsResult[Teams] = jsValue.validate[Teams]
                result
            }
        }

有更好的方法吗??

注意:我发现 akka-http-spray-json ,但我不知道如何实现它

解决方法

为了使用 akka-http-spray-json,您需要导入这些库。

"com.typesafe.akka" %% "akka-http" % akkaHttpVersion,  "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion,  "com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion,  "com.typesafe.akka" %% "akka-http2-support" % akkaHttpVersion,

然后按照以下步骤进行编组和解组 JSON 字符串。

  • 步骤 1 - 导入喷雾 json import spray.json._
  • 第 2 步 - 创建 JSON 协议。 extends DefaultJsonProtocol 的特征。请注意,Chat 类有 4 个参数,因此我在协议中使用了 jsonFormat4
  • 第 3 步 - 扩展您创建的特征
  • 第 4 步 - 添加 sprayJsonSupport

每次我需要向 akka 添加 json 支持时,我都会参考这个小例子:

import akka.actor.{Actor,ActorLogging,ActorSystem,Props}
import akka.http.scaladsl.Http
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import akka.http.scaladsl.server.Directives._
import akka.pattern.ask
import akka.util.Timeout
import spray.json._ // step 1 - import spray json
import scala.concurrent.Future
import scala.concurrent.duration._

// case class Player(nickname: String,characterClass: String,level: Int)
case class Chat(sender: String,receiver: String,message: String,groupChatName: String)

case object GetAllUsersInChat

case class AddUsers(player: Chat)

// step 2 - the JSON protocol
trait ChatJsonProtocol extends DefaultJsonProtocol {
  implicit val chatFormat = jsonFormat4(Chat)
}

class ChatActor extends Actor with ActorLogging {
  var users = Map[String,Chat]()

  override def receive: Receive = {
    case GetAllUsersInChat =>
      log.info(s"getting all users")
      sender() ! users.values.toList
    case AddUsers(user) =>
      log.info(s"trying to add user $user")
      users = users + (user.sender -> user)
    case _ => log.info(s"unknown message")
  }
}

// step 3 - extend ChatJsonProtocol
// step 4 - add sprayJsonSupport
object ChatMarshallingJSON extends ChatJsonProtocol with SprayJsonSupport {
  implicit val system = ActorSystem("ChatMarshallingJSON")
  val chatActor = system.actorOf(Props[ChatActor],"chatActor")
  // boot strap some users
  val chatusers = List(
    Chat("sender1","receiver1","message1","groupChat1"),    Chat("sender2","receiver2","message2","groupChat2"),    Chat("sender3","receiver3","message3","groupChat3")
  )
  chatusers.foreach { user =>
    chatActor ! AddUsers(user)
  }

  implicit val defaultTimeout = Timeout(2 seconds)

  val chatRoutes = {
    path("api" / "chat") {
      get {
        // 3: get all users in the chat
        val allUsersInChatFuture: Future[List[Chat]] = (chatActor ? GetAllUsersInChat).mapTo[List[Chat]]
        complete(allUsersInChatFuture)
      }
    }
  }

  def main(args: Array[String]): Unit = {
    println("http GET localhost:8080/api/chat")
    Http()
      .newServerAt("localhost",8080)
      .bindFlow(chatRoutes)
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-