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
Json 将键值字符串转换为Scala映射的方法_Json_Scala_Redis_Json4s - Fatal编程技术网

Json 将键值字符串转换为Scala映射的方法

Json 将键值字符串转换为Scala映射的方法,json,scala,redis,json4s,Json,Scala,Redis,Json4s,在这种情况下,我正在从KV存储(Redis)读取数据。返回的数据采用以下格式 { "key1":"value1", "key2":"value2", "key3":"value3" ...} 键是String,值是Int。我想把它转换成Map[String,Int] 我查看了JSON API,我当前的代码如下所示。有更好/更容易/更干净的方法吗 //send a async query to Redis to val queryFuture = redis.zrangebysco

在这种情况下,我正在从KV存储(Redis)读取数据。返回的数据采用以下格式

 { "key1":"value1", "key2":"value2", "key3":"value3" ...} 
键是
String
,值是
Int
。我想把它转换成
Map[String,Int]

我查看了JSON API,我当前的代码如下所示。有更好/更容易/更干净的方法吗

  //send a async query to Redis to
  val queryFuture  = redis.zrangebyscore[String](tablename, keymin, keymax )


  queryFuture.onComplete {
    case Success(datarows) =>
      println(s"Got %d rows of type %s for the query successfully".format(datarows.length))
      val jsonrows = for { x <- datarows.toList }
        yield parse(x)
      println("Got json rows %d".format(jsonrows.size))
      val mapdata = jsonrows.map(x => x.extract[Map[String,String]]).map( x => x.mapValues(_.toInt))

      //need to do something with this data now
    case Failure(y) =>
      println(s" there was some failure in getting the data from Redis")
  }
//向Redis发送异步查询以
val queryFuture=redis.zrangebyscore[String](表名、keymin、keymax)
queryFuture.onComplete{
案例成功(数据行)=>
println(s“为查询成功获取了%s类型的%d行”。格式(datarows.length))
val jsonrows=表示{x x.extract[Map[String,String]]].Map(x=>x.mapValues(uu.toInt))
//现在需要处理这些数据吗
案例失败(y)=>
println(s“从Redis获取数据时出现了一些故障”)
}

不知道json4s,不幸的是您输入了类型,但是猜测
jsonrows
可能类似于
列表[(字符串,字符串)]
您可以这样做

List(((“key1”->“1”),(“key2”->“2”)).map{case(k,v)=>(k,v.toInt)}.toMap


顺便说一句,如果你在你的
onComplete
中说
现在需要对这些数据做些什么
,那只会是一个副作用的操作。最好
在你的处理完成之前映射

不知道json4s,不幸的是你输入了类型,但是猜测
jsonrows
这就像一个
列表[(字符串,字符串)]
你可以做的

List(((“key1”->“1”),(“key2”->“2”)).map{case(k,v)=>(k,v.toInt)}.toMap


顺便说一句,如果你在你的
onComplete
中说
现在需要对这些数据做些什么
,那只会是一个副作用的操作。更好的
map
在将来,直到你的处理完成。

你的Json4s解决方案看起来不错。或者你可以使用
mapField
来转换
的字段>JObject
然后提取类型为
Map[String,Int]
的值

val json1 = parse(
  """
    |{
    |  "key1": "1024",
    |  "key2": "2048",
    |  "key3": "4096"
    |}
  """.stripMargin)

val json2 = json1.mapField {
  case (key, JString(value)) => (key, JInt(value.toInt))
  case x => x
}

val res = json2.extract[Map[String, Int]]

println(res)
// Map(key1 -> 1024, key2 -> 2048, key3 -> 4096)

您的Json4s解决方案看起来不错。或者,您可以使用
mapField
转换
JObject
的字段,然后提取类型为
Map[String,Int]
的值

val json1 = parse(
  """
    |{
    |  "key1": "1024",
    |  "key2": "2048",
    |  "key3": "4096"
    |}
  """.stripMargin)

val json2 = json1.mapField {
  case (key, JString(value)) => (key, JInt(value.toInt))
  case x => x
}

val res = json2.extract[Map[String, Int]]

println(res)
// Map(key1 -> 1024, key2 -> 2048, key3 -> 4096)

在我看来,这是最简单的方法:

val map = parse("""{"a":"1","b":"2","c":"3"}""")
  .children
  .collect { case JField(k, JString(v)) => (k, v.toInt) }
  .toMap

在我看来,这是最简单的方法:

val map = parse("""{"a":"1","b":"2","c":"3"}""")
  .children
  .collect { case JField(k, JString(v)) => (k, v.toInt) }
  .toMap

另请参见感谢onComplete输入。这不是一个真正的答案,但
map
备注是一个有效点。感谢onComplete输入。这不是一个真正的答案,但
map
备注是一个有效点。