Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
将json的一部分转换为Map[String,List[Double]]_Json_Scala_Spray_Spray Json - Fatal编程技术网

将json的一部分转换为Map[String,List[Double]]

将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"

我有下面的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":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]],…)