簡體   English   中英

將JsObject保存到JSON文件(無法將java.lang.String強制轉換為scala.scalajs.js.Any)

[英]Save a JsObject to JSON file (java.lang.String cannot be cast to scala.scalajs.js.Any)

我正在使用play框架創建一個json對象,之后,我應該將這些對象保存在json文件中。 linksEvolution是JsObject對象的序列。

  var linksEvolution: Seq[JsObject] = Seq()

一個JsObject由創建:

    val user = Json.obj(
        "link" -> [87, 98],
        "reference" -> [1,8],
    )

更新JsObject的列表:

    val tmplinksEvolution = linksEvolution :+ user

    linksEvolution = tmplinksEvolution

完成linksEvolution的更新后,現在我通過linksEvolution創建一個RDD,因此RDD中的每個元素都將保存在一個文件中,例如:

     //create the RDD
     val rddLinksEvolution = spark.sparkContext.parallelize(linksEvolution)
     //convert each JsObject to string
     val tmprddLinksEvolution = rddLinksEvolution.map(_.toString())
     //save the data on a text file
     tmprddLinksEvolution.saveAsTextFile("testSavingFile_2.json")

問題:出現錯誤:

java.lang.ClassCastException: java.lang.String cannot be cast to scala.scalajs.js.Any

僅當我使用maven install給定的jar文件時,才會引發此異常。 但是,當我使用Scala IDE(運行scala應用程序)運行相同的代碼時,它運行正常!

編輯:主要功能和依賴項中的示例

完整示例:

import play.api.libs.json.{ JsArray, JsNumber, JsObject, Json }
  import org.apache.spark.{ SparkConf, SparkContext }

  object TestJson {

  def main(args: Array[String]) = {

   var linksEvolution: Seq[JsObject] = Seq()
   val user = Json.obj(
  "link" -> JsArray(Seq(JsNumber(87), JsNumber(98))),
  "reference" -> JsArray(Seq(JsNumber(1), JsNumber(8))))


val tmplinksEvolution = linksEvolution :+ user
linksEvolution = tmplinksEvolution

val sc = new SparkContext(new    SparkConf().setAppName("test").setMaster("local"))

//create the RDD
val rddLinksEvolution = sc.parallelize(linksEvolution)
//convert each JsObject to string
val tmprddLinksEvolution = rddLinksEvolution.map(_.toString())
//save the data on a text file
 tmprddLinksEvolution.saveAsTextFile("testSavingFile_kk2.json")
 }
}

具有依賴項:

<dependencies>
  <!-- https://mvnrepository.com/artifact/com.typesafe.play/play-json -->
  <dependency>
    <groupId>com.typesafe.play</groupId>
    <artifactId>play-json_sjs0.6_2.11</artifactId>
    <version>2.6.0</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
    <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.4.0</version>
  </dependency>

我嘗試了您提到的示例,它對我來說很好用。

唯一的區別是定義了用戶對象:

  val user = Json.obj(
    "link" -> JsArray(Seq(JsNumber(87), JsNumber(98))),
    "reference" -> JsArray(Seq(JsNumber(1), JsNumber(8)))
  )

您還應該注意,輸出將是目錄而不是文本文件。 因此,您將找到一個名為“ testSavingFile_2.json”的目錄,並且在此目錄下將找到多個名為“ part-00000”,“ part-00001”,...的文件。

另外,我不確定您使用什么導入,但是這些是我使用的導入:

import play.api.libs.json.{ JsArray, JsNumber, JsObject, Json }

最后在這里找到解決方案(Lift-JSON解決方案)。

import scala.collection.mutable._
import net.liftweb.json._
import net.liftweb.json.Serialization.write

case class Person(name: String, address: Address)
case class Address(city: String, state: String)

object LiftJsonTest extends App {
    val p = Person("Alvin Alexander", Address("Talkeetna", "AK"))
    // create a JSON string from the Person, then print it
    implicit val formats = DefaultFormats
    val jsonString = write(p)
    println(jsonString)
}

通過使用字符串,我創建了這些字符串的RDD。 之后,我使用saveAsTextFile()保存了字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM