json4s org.json4s.package$MappingException: не знаю, как преобразовать JString в double

Я пробую очень простой пример, но не могу заставить его работать; Ниже приведен мой формат JSON, я использую парсер Scala json4s для разбора JSON; json4s не может проанализировать строку JSON, если какое-либо поле JSON не является строкой. Например, json4s не может разобрать field_3 как double и field_4 как int.

val jsonStr="""{ "data" : [
  {
    "field_1"  : "value_1",
    "field_2" : "value_2",
    "field_3"     : "76.7",
    "field_4"   : "8320"
  }
 ,{
    "field_1"  : "value_1",
    "field_2" : "value_2",
    "field_3"     : "96.5",
    "field_4"   : "128"
  }
 ,{
    "field_1"  : "value_1",
    "field_2" : "value_2",
    "field_3"     : "84.5",
    "field_4"   : "8320"
  }
  ] }"""

   case class TestClass(field_1: String, field_2: String, field_3: Double, field_4: Int) {
    override def toString = s"{field_1:$field_1,field_2:$field_2,field_3:$field_3,field_4:$field_4}"
  }

import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
  implicit val formats = DefaultFormats
  val JSON = parse(jsonStr)\"data"
  val info=JSON.extract[List[TestClass]]
  println(info)


  Exception in thread "main" org.json4s.package$MappingException: No usable value for value
Do not know how to convert JString(76.7) into double
    at org.json4s.reflect.package$.fail(package.scala:96)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:443)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$14.apply(Extraction.scala:463)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$14.apply(Extraction.scala:463)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.AbstractTraversable.map(Traversable.scala:105)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(Extraction.scala:451)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(Extraction.scala:491)
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(Extraction.scala:488)
    at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(Extraction.scala:500)
    at org.json4s.Extraction$ClassInstanceBuilder.result(Extraction.scala:488)
    at org.json4s.Extraction$.extract(Extraction.scala:332)
    at org.json4s.Extraction$CollectionBuilder$$anonfun$6.apply(Extraction.scala:341)
    at org.json4s.Extraction$CollectionBuilder$$anonfun$6.apply(Extraction.scala:341)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.AbstractTraversable.map(Traversable.scala:105)
    at org.json4s.Extraction$CollectionBuilder.mkCollection(Extraction.scala:341)
    at org.json4s.Extraction$CollectionBuilder.result(Extraction.scala:361)
    at org.json4s.Extraction$.extract(Extraction.scala:320)
    at org.json4s.Extraction$.extract(Extraction.scala:42)
    at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
    at com.spark.demo.JsonTest$.json4Parser(JsonTest.scala:149)
    at com.spark.demo.JsonTest$.main(JsonTest.scala:136)
    at com.spark.demo.JsonTest.main(JsonTest.scala)
Caused by: org.json4s.package$MappingException: Do not know how to convert JString(76.7) into double
    at org.json4s.Extraction$.convert(Extraction.scala:559)
    at org.json4s.Extraction$.extract(Extraction.scala:331)
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:431)
    ... 29 more

person nilesh1212    schedule 12.01.2017    source источник
comment
Здравствуйте, это известная ошибка в json4s?   -  person nilesh1212    schedule 16.01.2017
comment
Сильно застрял в этом вопросе :(   -  person nilesh1212    schedule 23.01.2017
comment
это не ошибка   -  person Sami Badawi    schedule 24.01.2017


Ответы (1)


Я решил эту проблему, используя что-то вроде:

case class TestClassHelper(field_1: String, field_2: String, field_3: String, field_4: String) {
    def toTestClass: TestClass(field_1, field_2, field_3.toDouble, field_4.toInt)

}
val infoTemp: List[TestClassHelper] =JSON.extract[List[TestClassHelper]]
val info: List[TestClass] = infoTemp.map(_.toTestClass())

Может быть, есть более элегантное решение, но это работает.

person Sami Badawi    schedule 23.01.2017
comment
Большое спасибо, это действительно полезно :) - person nilesh1212; 24.01.2017
comment
Я сам был очень раздражен этой проблемой. - person Sami Badawi; 24.01.2017
comment
@SamiBadawi вы имели в виду TestClassHelper, например --› case class TestClassHelper (field_1: String, field_2: String, field_3: String, field_4: String) { def toTestClass = TestClass (field_1, field_2, field_3.toDouble, field_4.toInt)} - person sri hari kali charan Tummala; 07.08.2019
comment
@SamiBadawi то, что является общим, не работает, выдавая класс TestClassHelper (field_1: String, field_2: String, field_3: String, field_4: String) { def toTestClass: TestClass (field_1, field_2, field_3.toDouble, field_4.toInt)} - person sri hari kali charan Tummala; 07.08.2019