将json的一部分转换为Map[String,List[Double]]
我有下面的json将json的一部分转换为Map[String,List[Double]],json,scala,spray,spray-json,Json,Scala,Spray,Spray Json,我有下面的json { "op":{ "samples":{ "ep_mem_high_wat":[ 0,0,0,0,0,0,0], "ep_mem_low_wat":[ 0,0,0,0,0,0,0] }, "samplesCount":60, "isPersistent":true, "lastTStamp"
{
"op":{
"samples":{
"ep_mem_high_wat":[ 0,0,0,0,0,0,0],
"ep_mem_low_wat":[ 0,0,0,0,0,0,0]
},
"samplesCount":60,
"isPersistent":true,
"lastTStamp":1415619627689,
"interval":1000
},
"hot_keys":[
{
"name":"counter::F03E91E2A4B9C25F",
"ops":0.11010372549516878
}
]
}
我想将这个Json的“samples”属性解析为Map[String,List[Double]]as
Map[String,List[Double]]("ep_mem_high_wat" -> [ 0,0,0,0,0,0,0],"ep_mem_low_wat" -> [0,0,0,0,0,0,0])
为此,我执行以下操作:创建案例类
case class Samples(properties:Map[String,List[Double]])
case class Op(samples:Samples,samplesCount:Int,isPersistent:Boolean,lastTStamp:Long,interval:Int)
case class Key(name:String,ops:Double)
case class BucketStatisticResponse(op:Op,hot_keys:List[Key])
然后我创建自定义Json协议
object BucketStatisticJsonProtocol extends DefaultJsonProtocol {
implicit object SamplesJsonFormat extends RootJsonFormat[Samples] {
def write(obj: Samples) = obj.toJson
def read(value: JsValue) = {
val props = value.asJsObject.fields
Samples(value.convertTo[Map[String,List[Double]]])
}
}
implicit val keyFormat = jsonFormat2(Key)
implicit val opFormat = jsonFormat5(Op)
implicit val bucketStatisticFormat= jsonFormat2(BucketStatisticResponse)
}
然后我尝试解析json
import BucketStatisticJsonProtocol._
val res = json.toJson.convertTo[BucketStatisticResponse]
因此,我将设计以下异常:
Exception in thread "main" spray.json.DeserializationException: Object expected in field 'op'
at spray.json.package$.deserializationError(package.scala:23)
at spray.json.ProductFormats$class.fromField(ProductFormats.scala:54)
at high.availability.poc.DynamicJson$BucketStatisticJsonProtocol$.fromField(DynamicJson.scala:23)
我做错了什么?查看错误消息:它在抱怨它在AST中为
op
字段找到的值的类型。因此,您实际解析的文档可能与上面的示例不匹配
除此之外,我觉得你的代码还可以。就口味而言,我通常不会扩展
DefaultJsonProtocol
;我将我的JSON格式放在package对象中,并导入DefaultJsonProtocol.\u以根据需要处理任何简单的转换。如果我将samples converter更改为隐式val samplesFormat=jsonFormat1(samples),那么我会在线程“main”中得到一个异常错误spray.json.DeserializationException:对象缺少必需的成员“samples”,您可以发布您试图解析的实际文档吗?错误消息似乎非常清楚(“字段'op'中预期的对象”)。要明确的是,如果它抱怨op
,它甚至没有得到samples
。您是否尝试过完全去掉samples
,只将字段声明为case class op(示例:Map[String,List[Double]],…)
?