【问题标题】:Convert JSON object to Scala object dynamically将 JSON 对象动态转换为 Scala 对象
【发布时间】:2022-01-04 23:02:48
【问题描述】:

我正在研究一个用例,我正在尝试构建一个 Web UI 界面(使用反应和播放框架),该界面将 Json/Json 字符串作为输入并返回表示给定 json 的 Scala 对象。

输入:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

输出:

{SomeObjectName}(1,1,"delectus aut autem", false)

这是我的理解,要从 json 中获取 scala 对象,我们需要 scala 对象类型。 例如,我们需要 MailServer 的类定义,如 example

所示

我找到了一个example,关于如何使用库将 json 转换为案例类:transform-json-types。这里的问题是这个库在 UI 中。如果我在 scala 中有这样的库,那就太好了,但我找不到。所以,我正在考虑将生成的案例类定义从 UI 发送到后端作为字符串,然后在后端提取案例类。

几个问题:

  1. 我可以从字符串中提取案例类定义吗?如果是,怎么做?
  2. 我的方向正确吗?
  3. 还有其他方法可以解决这个用例吗?

感谢任何帮助。请指出正确的方向。

【问题讨论】:

  • 所以您不能将所有可能的 json 定义为后端的对象吗?请记住,如果某些字段在 json 中是可选的,则可以在 scala 中将其定义为 Option。
  • 是的,因为用户输入在 UI 中。
  • 据我了解,您想处理任意 JSON 值,因此我将使用 play-json 中的 JsObject 例如并创建一个查看它并生成一个不错的字符串或案例类定义。
  • 您似乎只需要 Scala 中的 JSON 库,您是否看过:circeuJsonplay-json 等?
  • @LuisMiguelMejíaSuárez 是的,我看过其中一些库。还没有找到任何适合我要求的库。除非我错过了什么。

标签: json scala


【解决方案1】:

问题是,即使您有办法即时创建(或以某种方式推断现有定义)一个案例类,您也无法用它做很多事情:

    val foo = magicLibrary.readJson(fooJsonString) 

上面的foo是什么类型?必须是Any(或者,也许是AnyRef)。即使magicLibrary 有一种(神奇的)方法可以从给定的 json 中找出构造一个实际的类,您也无法在下游使用该类型,因为在编译时不会知道它。

你唯一能做的就是把它打印出来,或者,也许,转换回 json。但是你已经有了 json,所以这没什么用。

长话短说,除非我完全误解了你的意思,否则没有像这样的库,如果有的话,反正也没多大用处。

在这种情况下,您可以做的只是使用标准 json 库之一将输入解析为 Map[String, Any] ......这可能有用也可能没有用,具体取决于您实际想要做什么结果。

更好的是,重新设计您的 API 以处理实际已知的类型。

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 1970-01-01
    • 2014-05-23
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2014-02-08
    • 2011-11-16
    相关资源
    最近更新 更多