将 lift-json 提取到具有上限的案例类中

2023-12-21

我花了最后一天的时间搜索和阅读各种网站和文章,试图自己找到这个问题的答案,但我没有找到任何有帮助的东西。我什至不确定这是否可行。我的问题是我正在尝试使用 lift-json 解析和提取 Json 响应。响应由 4 部分组成,其中前 3 部分对于我提出的每种类型请求的每次响应始终相同。最后一部分根据请求的类型而有所不同,但它始终是某种类型的列表。我希望做这样的事情:

abstract class MyObjects
case class Apple(id: Int, name: String, color: String) extends MyObjects
case class Orange(id: Long, name: String, state: String) extends MyObjects

abstract class MyResponse
case class Fruits[T <: MyObjects](aisle: Int, bin: Int, hasWhat: Option[List[T]])

如果我想知道所有的苹果是什么,我会提出请求并得到包含苹果列表的响应。当我尝试提取这个示例时:

myJson.extract[Fruits[Apple]]

我收到此错误:

net.liftweb.json.MappingException: do not know how to get type parameter from T
    at net.liftweb.json.Meta$.fail(Meta.scala:128)
    at net.liftweb.json.Meta$Reflection$.term$1(Meta.scala:206)
    at net.liftweb.json.Meta$Reflection$.typeParameters(Meta.scala:220)
    at net.liftweb.json.Meta$.mkContainer$1(Meta.scala:91)
    at net.liftweb.json.Meta$.fieldMapping$1(Meta.scala:101)
    at net.liftweb.json.Meta$.mkContainer$1(Meta.scala:90)
    at net.liftweb.json.Meta$.fieldMapping$1(Meta.scala:107)
    at net.liftweb.json.Meta$.toArg$1(Meta.scala:117)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:83)
    at net.liftweb.json.Meta$$anonfun$constructors$1$1$$anonfun$apply$1.apply(Meta.scala:82)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:...

我正在使用 lift-json 2.1 和 scala 2.8。我确实有办法解决这个问题,通过为每种类型的响应专门创建一个案例类,但我认为我想做的更干净。只是想知道是否 a) 这可能吗? b) 如果是这样,我做错了什么?

编辑...示例应用程序:

val apples = """{ "aisle" : 1, "bin" : 1,
            "hasWhat" : [{ "id" : 4, "name" : "Granny", "color" : "green"}, 
                         { "id" : 4, "name" : "Fuji", "color" : "red"}] }"""

val oranges = """ { "aisle" : 3, "bin" : 2, 
             "hasWhat" : [{ "id" : 2, "name" : "Navel", "state" : "FL" }, 
                         { "id" : 2, "name" : "Clementine", "state" : "Spain" }]}"""

scala> val aJson = parse(apples)
aJson: net.liftweb.json.JsonAST.JValue = JObject(List(JField(aisle,JInt(1)), JField(bin,JInt(1)), JField(hasWhat,JArray(List(JObject(List(JField(id,JInt(4)), JField(name,JString(Granny)), JField(color,JString(green)))), JObject(List(JField(id,JInt(4)), JField(name,JString(Fuji)), JField(color,JString(red)))))))))

scala> val oJson = parse(oranges)
oJson: net.liftweb.json.JsonAST.JValue = JObject(List(JField(aisle,JInt(3)), JField(bin,JInt(2)), JField(hasWhat,JArray(List(JObject(List(JField(id,JInt(2)), JField(name,JString(Navel)), JField(state,JString(FL)))))))))

scala> val doesntWork = aJson.extract[Fruits]
doesntWork: org.spin.node.gogrid.objects.Fruits = Fruits(1,1,None)

scala> val works = aJson.extract[AFruit]
works: org.spin.node.gogrid.objects.AFruit = AFruit(1,1,Some(List(Apple(4,Granny,green), Apple(4,Fuji,red))))

我希望 doestWork 像works一样,其中:

case class AFruit(aisle: Int, bin: Int, hasWhat: Option[List[Apple]])

谢谢! -新手


尚不支持提取参数化案例类。一种解决方法(但不确定这是否适合您的情况)是使 Fruits 成为具体类型并将类型信息添加到 JSON 中。

import net.liftweb.json._
import net.liftweb.json.Extraction._
import net.liftweb.json.JsonAST._
import net.liftweb.json.Printer._

abstract class MyObjects
case class Apple(id: Int, name: String, color: String) extends MyObjects
case class Orange(id: Long, name: String, state: String) extends MyObjects

case class Fruits(aisle: Int, bin: Int, hasWhat: Option[List[MyObjects]])

object Test extends Application {
  // This configuration adds an extra field for MyObjects to JSON
  // which tells the real type of a MyObject.
  implicit val formats = Serialization.formats(FullTypeHints(List(classOf[MyObjects])))

  val fs = Fruits(0, 0, Some(List(
    Apple(1, "Granny Smith", "green"), 
    Apple(2, "Grenade", "red"))))
  val json = decompose(fs)
  println(pretty(render(json)))

  assert (json.extract[Fruits] == fs)
}

打印:

{
  "aisle":0,
  "bin":0,
  "hasWhat":[{
    "jsonClass":"Apple",
    "id":1,
    "name":"Granny Smith",
    "color":"green"
  },{
    "jsonClass":"Apple",
    "id":2,
    "name":"Grenade",
    "color":"red"
  }]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 lift-json 提取到具有上限的案例类中 的相关文章

  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 如何将对象从 rake 任务传递给 Rabl 视图

    我正在尝试使用 rabl 从 rake 任务创建 json 文件 下面我有一个简化版本来测试 当我通过 url 查看 articles json 或 articles 2 json 时 我得到了预期的 json 响应 但是当我尝试通过 ra
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • 如何绕过 CF8 编码不可打印字符中的 SerializeJSON?

    SerializeJSON 创建具有不可打印字符 即 ASCII 21 的 JSON 这是无效的 JSON 我该如何解决这个问题 删除不可打印字符的正则表达式会起作用吗 什么正则表达式会删除不可打印的字符 嗯 这个简单的解决方案是为 cff
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 如何将 JSON 文本转换为 PHP 关联数组

    我将以下 JSON 对象存储在文本文件 data txt 中 player black time 0 from 2c to 3d 我使用 php 阅读 问题 有没有简单的方法可以转换 data到 PHP 关联数组 我尝试过使用json de
  • 在 Node.js 中创建 JSON 数组

    我需要在用 Node js 编写的服务器中创建一个 JSON 字符串 以便在请求时发送到客户端 问题是这个 JSON 取决于服务器中的可用数据 因此 JSON 数组的大小并不总是相同 我已经尝试了一整天 但尽管我感觉很接近 但我仍然不明白
  • 使用 Jackson 删除 JSON 元素

    我有一个特定的 JSON 节点 对应于 import org codehaus jackson JsonNode 而不是 导入 org codehaus jackson map JsonNode givenName Jim formatte
  • 使用 NSJSONSerialization 解析 JSON

    对此进行了太多讨论 但我不知道如何解决我的问题 这是我从 WorldWeatherOnline 获取的 JSON 数据 JSON 有效 但我不知道如何解析它 这是我的代码 后面是 JSON 请帮忙 NSError errorInfo NSD
  • PHP:file_get_contents 与 json_decode 不能一起工作

    使用 file get contents 读取 json 文件后遇到问题 当我运行这段代码时 它工作正常
  • 将 DOCTYPE 添加到 Scala XML 的最简单方法?

    我怎样才能在 Scala XML 中制作这个最小的 HTML5 p p 当然 在 Scala 中制作类似 HTML 的 XML 很简单 gt val html p p html scala xml Elem p p 但是 我怎样才能注入DO
  • Jack(Java Android 编译器套件)将如何影响 Scala 开发人员

    现在随着公告Jack https source android com source jack html谷歌阐明了 Java 与 Android 相关的可预见的未来 但这对 Scala 和其他基于 JVM 的语言开发人员有何影响 尤其 Sc
  • 读取不同文件夹深度的多个 csv 文件

    我想递归地将给定文件夹中的所有 csv 文件读入 Spark SQLDataFrame如果可能的话 使用单一路径 我的文件夹结构如下所示 我想包含具有一个路径的所有文件 resources first csv resources subfo
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • Akka中有轻量级的actor吗?

    我的用例非常简单 在两个对象之间交换少量 现在我正在从 Scala Actors 迁移到 Akka 但是我再也找不到那些轻量级 Actors 使用Akka 我不仅需要为Actor创建创建ActorSystem Props 还需要照顾Acto
  • 如何使用精炼库定义 A 和 B 取决于彼此的类型类?

    Problem 我有一个案例类 Passenger 从 A 点出发 前往 B 点 有效乘客意味着A点不等于B点 Passenger a Int b Int 问题 我如何使用设计乘客舱refind https index scala lang
  • SBT插件——编译前执行自定义任务

    我刚刚编写了我的第一个 SBT 自动插件 它有一个生成设置文件的自定义任务 如果该文件尚不存在 当显式调用任务时 一切都会按预期工作 但我希望在使用插件编译项目之前自动调用它 无需项目修改其 build sbt 文件 有没有办法实现这一点
  • 在 Scala 中反转地图的优雅方法

    目前正在学习Scala 需要反转Map 来进行一些反转值 gt 键查找 我一直在寻找一种简单的方法来做到这一点 但只想到了 Map origMap map kvp gt kvp 2 gt kvp 1 有人有更优雅的方法吗 假设值是唯一的 则
  • Map 和 Set 的实际类(不是抽象类,也不是特征类)是什么?

    在 Scala 中 映射和集合文字可以通过以下方式创建 val m Map 1 gt a 以及引用的类型m字面意思都是Map Int String 然而 scala文档表明Map实际上是一个特征 具有需要实现才能实例化的抽象成员 scala
  • 如何在scala中生成n-gram?

    我正在尝试在 scala 中编写基于 n gram 的分离新闻算法 如何为大文件生成 n gram 例如 对于包含 蜜蜂是蜜蜂中的蜜蜂 的文件 首先它必须选择一个随机的 n 元语法 例如 蜜蜂 然后它必须寻找以 n 1 个单词开头的 n 元

随机推荐

  • 如何向 Facet_Grid 条带标签添加希腊字母?

    我使用创建了下面的图facet grid并使用过labeller参数将 p 和 mu 2 标签添加到网格周围的灰色条带 我想用带有下标 2 的希腊字母 mu 替换我用红色矩形表示的 mu 2 标签 如果有人可以帮助我 我将不胜感激 如果需要
  • 为什么在 Linux 内核中忙于循环时,进程会被长时间剥夺 CPU 资源?

    乍一看 我的问题可能看起来有点微不足道 请耐心阅读并完整阅读 我在我的 Linux 内核模块中发现了一个繁忙的循环 因此 其他进程 例如 sshd 在很长一段时间内 例如 20 秒 无法获得 CPU 时间 这是可以理解的 因为我的机器只有一
  • 如何按给定索引处的项目过滤元组列表并将其转换为列表字典

    我有一个如下所示的列表 Lista amazon Amazon 1 0 amazon Alexa 0 8 amazon microsoft 0 6 amazon Amazon Pay 0 7 amazon Prime 0 4 alien j
  • Node.js:process.env 与全局有何不同?

    如何设置环境变量process env thing 42与创建全局变量不同global thing 42 什么时候更愿意process env thing over global 这两个对象的优点 缺点是什么 global是全局对象 pro
  • 颤动错误:类型“_Smi”不是类型“double”的子类型

    我使用 flutter 1 0 开发了一个应用程序 该应用程序在大多数 Android 和 iOS 手机上运行良好 但我发现有一部Android手机和一部iPhone无法打开该应用程序 只显示错误消息 类型 Smi 不是类型 double
  • 车把,加载外部模板文件

    我的目标是将所有 Handlebars 模板放在一个文件夹中 如下所示 templates products hbs templates comments hbs 我通过粗略的 Google 搜索在几个地方找到了这个片段 它显然会加载到外部
  • 忽略 Mercurial 中文件的未来更改,但仍然跟踪它[重复]

    这个问题在这里已经有答案了 可能的重复 Mercurial 如何忽略对跟踪文件的更改 https stackoverflow com questions 2856571 mercurial how to ignore changes to
  • IE 在打印时删除网页的颜色

    你好 我有一个网站 其背景颜色在打印时很重要 但 IE 会删除页面中的所有颜色 我知道有一些设置可以在 IE 上禁用此选项 但我不能依赖用户进入 IE 设置来禁用 IE 上的此选项 有什么方法可以从我的网页或其他方式禁用此功能吗 提前致谢
  • 在javascript中显示明天的名字?

    我试图在我们的电子商务网站上输出类似于以下内容的内容 Order by 5pm today for dispatch on Monday 显然 星期一 一词将被第二天的名称取代 最好是下一个工作日 即不是星期六或星期日 我有以下简单的 ja
  • Promise 函数延迟状态变量

    如何立即正确地存储 Promise 函数的值 我正在尝试使用 useEffect 挂钩 但我的状态仍然延迟 这是有问题的 因为如果用户正在验证他的购物车 则可能会应用错误的税 useEffect gt SalesTax getSalesTa
  • JavaScript。 Math.sqrt 将 NaN 赋予正数?

    我目前有一个脚本 可以从文本区域获取数字并用它们进行各种计算 我的标准差函数遇到问题 因为即使它的类型是数字 并且它是正数 56 它也不会输出该值 当我运行这段代码时 var variance findVariance array vari
  • Java 类中的 Grails @Autowire 不起作用

    我有一些 Java 代码 我想将它们转换为 Bean 可以通过依赖注入在 Grails 控制器和服务中使用 代码是基于这个here https spring io guides gs accessing data neo4j 作为独立的 J
  • 在 GridView 组件中显示多个图像时 Android 应用程序崩溃

    我对这个网站相当陌生 我来这里是因为我在其他地方找不到这个答案 所以我想看看是否可以获得一些帮助 我的项目中有一个 GridView 以及一个图像适配器 我需要以下代码的帮助 package com humanoid sigma impor
  • 在 Swift 中使用 @discardableResult 进行闭包

    斯威夫特 3 有介绍 https github com apple swift evolution blob master proposals 0047 nonvoid warn md the discardableResult函数的注释可
  • 如何在 SvelteKit 应用程序启动时执行代码

    我正在开发一个基于 SvelteKit 的应用程序 在服务器启动时 无论是在开发服务器启动 Node js 适配器启动时 我想执行一些诊断命令 此类操作的一个示例是对后端服务器执行 ping 操作 如果后端无法访问 则会提前失败 这主要是服
  • 如何获取已加载的 JNI 库的列表?

    正如主题所说 Java 中有没有一种方法可以获取在任何给定时间加载的所有 JNI 本机库的列表 免责声明 请注意 这个解决方案总是很hackish 现在在大多数情况下将不再起作用 查看本杰明的回答 https stackoverflow c
  • 使用 Java SDK、连接模式访问 Azure 服务总线

    有几个使用 C 配置服务总线环境以使用 http https 的示例 使用以下调用 ServiceBusEnvironment SystemConnectivity Mode ConnectivityMode Http 我的问题是 可以以及
  • 我如何设计一个数据库,用户可以在其中定义 M-D 关系中的详细表的字段和类型?

    我的应用程序有一个名为 events 的表 每个事件在 eventdata 表中都有大约 30 个标准字段 而且还有可以是任何名称或类型的用户定义字段 用户可以通过指定 x 个字段 文本 双精度 日期时间 布尔值 以及这些字段的名称来定义这
  • 无法在 Google Cloud SQL (MySQL) 上存储特殊字符

    我有两个 MySQL 实例 本地实例和 Google Cloud SQL 实例 使用字符集在两者上创建相同的数据库utf8mb4 当我运行时可以验证 show variables like character set database 同样
  • 将 lift-json 提取到具有上限的案例类中

    我花了最后一天的时间搜索和阅读各种网站和文章 试图自己找到这个问题的答案 但我没有找到任何有帮助的东西 我什至不确定这是否可行 我的问题是我正在尝试使用 lift json 解析和提取 Json 响应 响应由 4 部分组成 其中前 3 部分