2017-01-12 1 views
1

J'essaye un exemple très simple, mais je n'arrive pas à le faire fonctionner; Voici mon format JSON, j'utilise l'analyseur Scala json4s pour analyser JSON; json4s ne parvient pas à analyser une chaîne JSON si un champ JSON n'est pas une chaîne. Par exemple, json4s ne parvient pas à analyser field_3 comme double et field_4 comme 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 
+0

Bonjour, Est-ce un bug connu dans json4s? – nilesh1212

+0

Bloqué mal à ce problème :( – nilesh1212

+0

Ce n'est pas un bug –

Répondre

1

J'ai résolu ce problème en utilisant quelque chose comme:

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()) 

Peut-être il y a une solution plus élégante, mais cela devient le travail accompli.

+0

Merci beaucoup c'est vraiment utile :) – nilesh1212

+0

J'ai été très ennuyé par ce problème moi-même. –