【问题标题】:Convert query string to map in scala将查询字符串转换为scala中的映射
【发布时间】:2017-03-15 14:32:05
【问题描述】:

我有一个这样的查询字符串:

val query = "key1=val1&key2=val2&key3=val3

我想用上述键/值对创建一个映射。到目前为止,我正在这样做:

//creating an iterator with 2 values in each group. Each index consists of a key/value pair
val pairs = query.split("&|=").grouped(2)

//inserting the key/value pairs into a map
val map = pairs.map { case Array(k, v) => k -> v }.toMap

像我这样做有什么问题吗?如果是这样,是否有一些我可以使用的库?

【问题讨论】:

  • 查看这篇文章:stackoverflow.com/questions/13592236/… 他们提到了在 Java 中做同样事情的不同方法或使用 Java 库。所以在Scala中使用它们应该没有问题。
  • 这看起来不错,而且比使用外部库更简单。

标签: scala dictionary query-string


【解决方案1】:

这是使用URLEncodedUtils的方法:

import java.net.URI

import org.apache.http.client.utils.URLEncodedUtils
import org.apache.http.{NameValuePair => ApacheNameValuePair}

import scala.collection.JavaConverters._
import scala.collection.immutable.Seq

object GetEncodingTest extends App {
  val url = "?one=1&two=2&three=3&three=3a"
  val params = URLEncodedUtils.parse(new URI(url), "UTF_8")

  val convertedParams: Seq[ApacheNameValuePair] = collection.immutable.Seq(params.asScala: _*)
  val scalaParams: Seq[(String, String)] = convertedParams.map(pair => pair.getName -> pair.getValue)
  val paramsMap: Map[String, String] = scalaParams.toMap
  paramsMap.foreach(println)
}

【讨论】:

  • 嗨。这适用于完整的 url 字符串,但我需要转换的字符串仅包含查询字符串。那是例如。像“key1=value1&key2=value2”,仅此而已。解析方法似乎也被弃用了?
  • 嗯,解决了小问题的解决方案。如果我在前面加上“?”对于我的字符串,解析器可以使用它。此外,如果我在解析方法中使用 StandardCharsets.UTF_8 作为参数而不是“UTF-8”,则调用未弃用的方法。泰:)
  • URLEncodedUtils 是 apache 的 HttpClient (mvnrepository.com/artifact/org.apache.httpcomponents/httpclient) libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.11" 的一部分
【解决方案2】:

假设您正在使用的查询字符串与您展示的一样简单,使用grouped(2) 是一个很好的洞察力,并提供了一个非常优雅的解决方案。

下一步是使用记录不足的Array::toMap 方法:

val qs = "key=value&foo=bar"
qs.split("&|=")              // Array(key, value, foo, bar)
  .grouped(2)                // <iterator>
  .map(a => (a(0), a(1)))    // <iterator>
  .toMap                     // Map(key -> value, foo -> bar)

grouped(2) 返回一个Iterator[Array[String]],这有点难以理解,因为迭代器在 Scala 控制台上不能很好地序列化。

这是相同的结果,但要一步一步来:

val qs = "key=value&foo=bar"
qs.split("&")                                      // Array(key=value, foo=bar)
  .map(kv => (kv.split("=")(0), kv.split("=")(1))) // Array((key,value), (foo,bar))
  .toMap                                           // Map(key -> value, foo -> bar)

如果您想要更通用的 HTTP 查询字符串解决方案,请考虑使用库进行 URL 解析。

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多