Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';用JSON4s解构JSON数组最优雅的方法是什么?_Json_Scala_Json4s - Fatal编程技术网

什么';用JSON4s解构JSON数组最优雅的方法是什么?

什么';用JSON4s解构JSON数组最优雅的方法是什么?,json,scala,json4s,Json,Scala,Json4s,我必须将以下JSON解构为案例类列表: { “数据”:[ [49,true,14,null,null], [52,false,null,null,null], [72,对,4,2,1] ] } 案例类别: case类数据(i1:Int,b:Bool,i2:Option[Int],i3:Option[Int],i4:Option[Int]) 我开始用一个字母来表示理解,但没能完成: 用于{ JArray(data)如果您允许包含Rapture JSON库,可以按如下方式完成,仍然使用JSON4

我必须将以下JSON解构为案例类列表:

{
“数据”:[
[49,true,14,null,null],
[52,false,null,null,null],
[72,对,4,2,1]
]
}
案例类别:

case类数据(i1:Int,b:Bool,i2:Option[Int],i3:Option[Int],i4:Option[Int])
我开始用一个字母来表示理解,但没能完成:

用于{

JArray(data)如果您允许包含Rapture JSON库,可以按如下方式完成,仍然使用JSON4S后端。这需要以下导入:

import rapture.json._, jsonBackends.json4s._
如果您已经将JSON作为
JValue
,可以将其转换为Rapture的
JSON
类型,如下所示:

val json = Json(jValue)
根据您的案例类定义,您需要为
数据
类型重新定义JSON提取器(已经有一个默认提取器需要JSON对象),如下所示:

implicit val dataExtractor = Json.extractor[Json].map { j =>
  Data(j(0).as[Int], j(1).as[Boolean], j(2).as[Option[Int]],
      j(3).as[Option[Int]], j(4).as[Option[Int]])
}
然后,您可以使用以下方法提取它:

val list = json.as[List[Data]]
您可以为
数据
编写一个

我引入了一个
JOptionInt
提取器,将
JInt
JNull
转换为
选项[Int]
,可以直接在json4s中完成

import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._

case class Data(i1: Int, b: Boolean, i2: Option[Int], i3: Option[Int], i4: Option[Int])

object DataSerializer extends CustomSerializer[Data]( format => ( 
  {
    case JArray(List(JInt(i1), JBool(b), JOptionInt(i2), JOptionInt(i3), JOptionInt(i4))) =>
      Data(i1.toInt, b, i2, i3 , i4) 
  }, {
    case d: Data => JArray(List(d.i1, d.b, d.i2, d.i3, d.i4)) 
  }  
))

object JOptionInt {
  def unapply(x: JValue) : Option[Option[Int]] = x match {
    case JInt(i) => Option(Option(i.toInt))
    case JNull   => Option(None)
    case _       => None
  }
}
它可以用作:

implicit val formats = DataSerializer

val json = parse("""
      {
        "data": [
          [49, true, 14, null, null],
          [52, false, null, null, null],
          [72, true, 4, 2, 1]
        ]
      }
      """)

val result = (json \ "data").extract[Array[Data]]
// Array(Data(49,true,Some(14),None,None), Data(52,false,None,None,None), Data(72,true,Some(4),Some(2),Some(1)))

谢谢,但是我更愿意只为这个使用json4s。谢谢,这样做了!