Альтернатива устаревшему пакету анализа scala.util.parsing.json.JSON [закрыто]
Я хотел бы переписать следующий код, который в настоящее время использует пакет синтаксического анализа внутри него, но этот пакет устарел для Scala 2.11, поэтому я ищу другой синтаксический анализатор, с помощью которого я мог бы переписать этот код:
%scala
import za.co.absa.spline.harvester.conf.StandardSplineConfigurationStack
import za.co.absa.spline.harvester.extra.UserExtraMetadataProvider
import za.co.absa.spline.harvester.HarvestingContext
import org.apache.commons.configuration.Configuration
import za.co.absa.spline.harvester.SparkLineageInitializer._
import za.co.absa.spline.harvester.conf.DefaultSplineConfigurer
import za.co.absa.spline.producer.model._
import scala.util.parsing.json.JSON
val splineConf: Configuration = StandardSplineConfigurationStack(spark)
spark.enableLineageTracking(new DefaultSplineConfigurer(splineConf) {
val notebookInformationJson = dbutils.notebook.getContext.toJson
val outerMap = JSON.parseFull(notebookInformationJson).getOrElse(0).asInstanceOf[Map[String,String]]
val tagMap = outerMap("tags").asInstanceOf[Map[String,String]]
val extraContextMap = outerMap("extraContext").asInstanceOf[Map[String,String]]
val notebookPath = extraContextMap("notebook_path").split("/")
val notebookURL = tagMap("browserHostName")+"/?o="+tagMap("orgId")+tagMap("browserHash")
val user = tagMap("user")
val name = notebookPath(notebookPath.size-1)
val notebookInfo = Map("notebookURL" -> notebookURL,
"user" -> user,
"name" -> name,
"mounts" -> dbutils.fs.ls("/mnt").map(_.path),
"timestamp" -> System.currentTimeMillis)
val notebookInfoJson = scala.util.parsing.json.JSONObject(notebookInfo)
override protected def userExtraMetadataProvider: UserExtraMetadataProvider = new UserExtraMetadataProvider {
override def forExecEvent(event: ExecutionEvent, ctx: HarvestingContext): Map[String, Any] = Map("foo" -> "bar1")
override def forExecPlan(plan: ExecutionPlan, ctx: HarvestingContext): Map[String, Any] = Map("notebookInfo" -> notebookInfoJson)
override def forOperation(op: ReadOperation, ctx: HarvestingContext): Map[String, Any] = Map("foo" -> "bar3")
override def forOperation(op: WriteOperation, ctx: HarvestingContext): Map[String, Any] = Map("foo" -> "bar4")
override def forOperation(op: DataOperation, ctx: HarvestingContext): Map[String, Any] = Map("foo" -> "bar5")
}
})
Мне нужна помощь в переписывании кода с помощью синтаксического анализатора, совместимого со Scala 2.11, в частности следующих строк кода, в которых используется
scala.util.parsing.json.JSON
разобрать код. :
val outerMap = JSON.parseFull(notebookInformationJson).getOrElse(0).asInstanceOf[Map[String,String]]
val notebookInfoJson = scala.util.parsing.json.JSONObject(notebookInfo)
Спасибо
1 ответ
Если вы хотите вручную создать JSON с помощью Circe, вы можете сделать что-то вроде этого:
import io.circe.Json
Json.obj("notebookURL" -> Json.fromString("notebookURL"),
"user" -> Json.fromString("user"),
"name" -> Json.fromString("name"),
"mounts" -> Json.arr(Seq("a", "b").map(Json.fromString) :_*),
"timestamp" -> Json.fromLong(System.currentTimeMillis)
)
// This is quite convoluted, because your input data has values
// of different types (Map[String, Any]).
// It would look nicer if there were only Strings for example
import io.circe.syntax._
Map("notebookURL" -> "notebookURL",
"user" -> "user",
"name" -> "name").asJson
Но обычно у вас есть класс case для описания структуры данных, и вместо этого нужно работать с Circe .
import io.circe.generic.auto._, io.circe.syntax._
case class Info(
notebookUrl: String,
user: String,
name: String,
mounts: Seq[String],
timestamp: Long
)
Info("url", "user", "name", Seq("a", "b"), System.currentTimeMillis).asJson
Без наследования класса case (если вы хотите работать с узлами JSON напрямую) другие библиотеки JSON будут проще в использовании, чем Circe.