在Scala中将JSON字符串转换为JSON对象

23
我想将一个简单的JSON字符串(例如{"Name":"abc","age":10})转换为相应的JSON对象(而不是自定义的Scala对象,例如“Person”)。Scala是否支持将String转换为JSON对象的内置方法?
我不会进行任何复杂的JSON操作,我只需要将String转换为JSON对象。最简单的方法是什么?我是Scala的新手,所以如果这个问题听起来非常基础,请原谅。
谢谢。

Scala中有许多JSON库。它们每个都提供一个解析函数来从字符串中获取JSON值。您首先需要选择一个库(Play JSON,Argonaut等)。 - cchantep
@cchantep 谢谢,但我想尽可能避免使用外部库。这就是为什么我想知道Scala是否有一些内置支持。看来我只能使用一个库了。 - drunkenfist
5个回答

23

注意: 从技术上讲,现在没有了 Scala "原生" 解析 JSON 的核心方式。你应该使用像 Spray JSON 或 Play JSON 这样的外部支持库。

自 Scala 2.11 开始,解析器组合库不再包含在核心语言 jar 包中,需要单独添加到您的项目中。此外,在解析器组合库的社区支持版本中,JSON 解析器已被弃用。我不建议使用这个库。

如果您选择添加它到您的项目中,可以通过将以下内容添加到 build.sbt 中来实现:

libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.4"

您可以在https://github.com/scala/scala-parser-combinators找到该库的源代码。


因为您特别询问关于 Scala 原生的 JSON 解析工具 - 您要寻找的包是 scala.utils.parsing.json。类似以下的代码应该可以工作:

import scala.util.parsing.json._

val parsed = JSON.parseFull("""{"Name":"abc", "age":10}""")

parsed将取得如下值:Some(Map(Name -> abc, age -> 10.0))


2
JSON自2.11版本开始已被弃用 @scala.deprecated("This object will be removed.", "2.11.0"),对象JSON继承了scala.util.parsing.json.Parser。 - Ram Ghadiyaram
@RamGhadiyaram看起来你是正确的。你认为我应该删除这个答案吗? - DemetriKots
请注意,虽然社区支持的库在最初的2.11.0版本之后仍得到维护,但该功能已被弃用,尽管库的其余部分仍在得到维护。 - DemetriKots
据我所知,您不应该删除它。相反,作为注释提到版本名称;仍在使用旧版本Scala的用户仍然可以使用它。这就是我的意思。 - Ram Ghadiyaram

15

同时,你还可以使用play framework的Json库,但也可以作为独立库使用。该库基于一个好的但已经被放弃的Jerkson项目,这是一个围绕超快速的基于Java的JSON库Jackson的Scala包装器。它具有非常丰富和良好记录的工具集,可用于处理JSON-转换器、验证器等。

import play.api.libs.json._

val json: JsValue = Json.parse("""{"a":1}""")

如果您想在没有Play框架的情况下使用此库,只需在build.sbt中使用字符串进行安装即可。

libraryDependencies += "com.typesafe.play" %% "play-json" % "2.3.0"

11

您可能想要使用像Spray JSON这样的库。它提供了许多易于使用的功能,用于转换到JSON和从JSON转换。

如果您决定使用Spray JSON,可以这样做:

import spray.json._
// some code here
val json = "your json string here".parseJson

当我导入**spray.json._**时,它显示错误。我认为应该给它库依赖性。那么库依赖性应该是什么??? - ADARSH K
2
libraryDependencies += "io.spray" %% "spray-json" % "1.3.5" 是库依赖。 - ADARSH K

3

parseFull 返回的是 Some(Map),而 parseRaw 返回的是 Some(JSONObject)

import scala.util.parsing.json._

val parsed = JSON.parseRaw("""{"Name":"abc", "age":10}""").getOrElse(yourDefault)

parsed是一个JSONObject


JSON自2.11版本开始已被弃用 @scala.deprecated("This object will be removed.", "2.11.0"),对象JSON扩展了scala.util.parsing.json.Parser。 - Ram Ghadiyaram

1

关于使用 dijon(底层使用jsoniter-scala)的建议未能找到。

请将以下内容添加到您的build.sbt文件中:

libraryDependency += "me.vican.jorge" %% "dijon" % "0.6.0" // Use %%% instead of %% for Scala.js

通过添加import语句打开动态类型支持:

import scala.language.dynamics._

或通过设置Scala编译器选项:

scalacOptions += "-language:dynamics"

添加dijon的包对象导入以获取主要功能:
import dijon._

如果需要扩展JSON功能,可以选择导入jsoniter-scala-core包对象:

import com.github.plokhotnyuk.jsoniter_scala.core._

解析和访问已解析数据:

val json = parse("""{"Name":"abc", "age":10}""")

println(json.age)

使用 Scastie 在线尝试这段代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接