Spray-json将部分json转换为Map [String,List [Double]]

丹尼·莱斯尼克

我有以下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的“样本”属性解析为Map [String,List [Double]],如下所示:

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)

我究竟做错了什么?

亚历克斯·克鲁斯

查看错误消息:它正在抱怨它在ASTop字段中找到的值的类型因此,您实际上正在解析的文档可能与上面的示例不匹配。

除此之外,您的代码对我来说还可以。就品味而言,我通常不会扩展DefaultJsonProtocol我将JSON格式放入package对象中,并import DefaultJsonProtocol._根据需要处理任何简单化的转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala - 将 List[((String, String), Double)] 转换为 List[String,Map[String,Double]]

使用Spray json序列化Map [String,Any]

Spray Json:将泛型类型转换为JsonFormat

将Json转换为Map [String,String]

将 JSON 数据转换为 List<Map<String, dynamic>>

MongoSpark-将bson文档转换为Map [String,Double]

使用play框架将Json值转换为List [(T,Double)]

我要从Json响应返回String的Spray Client

将Scala List [List [Double]]转换为Java double [] []

无法使用 AKKA-Http 和 Spray-Json 将 JSON Marshal B 定义为 List[A]

将Double转换为String的最佳实践

XJC限制将Double转换为String

将很小的double转换为String

将Double转换为String Android

Swift 3将Double转换为String

将List <double>转换为double [n,1]

将RDD对JavaPairRDD <String,Double>转换为JavaPairRDD <Integer,Double>

Jackson-将List <Map <String,String >>转换为Json String的Java对象

将(String,List [(String,String)])转换为JSON对象

将多值 Map<String, Object [ ]> 转换为 javascript 中的 json

解析 json 并将 Double 转换为 String(无法将“NSTaggedPointerString”(0x1098a1b90)类型的值转换为“NSNumber”)

如何使用spray-json将入站空可选数组字段转换为None?

Spray JSON格式和转换错误

将Json转换为List

Json 解码转换为 List<dyamic> 而不是 Map<String, dynamic>

我如何将具有混合类型值的json通过scala和json spray转换为json

Swift:将 [Dictionary<String, [String : Double]>.Element] 转换为 [String : [String : Double]]

将 List<List<TextValue>> 转换为 List<Map<String, String>>

将List <Map <String,List <String >>>转换为String [] []