2014-03-29 49 views
1

在这种情况下,我正在从KV商店(Redis)读取数据。返回的数据格式如下。将键值字符串转换为Scala的方法地图

{ "key1":"value1", "key2":"value2", "key3":"value3" ...} 

主要是String和价值是Int。我想将其转换为Map[String,Int]

我查看了json4s 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") 
    } 
+0

参见https://stackoverflow.com/questions/22723965/convert-a-mapstring-string-to-mapstring -int-in-scala – DNA

回答

1

您的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) 
1

不知道json4s,不幸的是你中省略的类型,但猜测,jsonrows可能是有点像List[(String, String)]你可以做 List(("key1" -> "1"),("key2" -> "2")).map { case (k, v) => (k, v.toInt)}.toMap

顺便说一句,如果你说在need to do something with this data nowonComplete - 只有能是一个影响操作的副作用。在未来更好的map直到您的处理完成。

+0

感谢您的onComplete输入。 –

+0

这不是一个真正的答案,但“地图”的评论是一个有效的观点。 –

2

这看起来对我来说,最简单的方式做到这一点:

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