Альтернатива устаревшему пакету анализа 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.

Другие вопросы по тегам