将字符串解析为映射Golang

时间:2016-02-26 23:59:59

标签: parsing dictionary go

我有一个像A = B& C = D& E = F的字符串,如何在golang中将其解析为地图?

这是关于Java的示例,但我不理解这个split部分

String text = "A=B&C=D&E=F";
Map<String, String> map = new LinkedHashMap<String, String>();
for(String keyValue : text.split(" *& *")) {
   String[] pairs = keyValue.split(" *= *", 2);
   map.put(pairs[0], pairs.length == 1 ? "" : pairs[1]);
}

4 个答案:

答案 0 :(得分:8)

也许您真正想要的是解析HTTP查询字符串,而url.ParseQuery就是这样做的。 (更确切地说,它返回的是url.Values为每个键存储[]string,因为URL有时每个键有多个值。)它执行解析HTML转义({{1}只是拆分不会。如果您在the source of url.go中搜索,可以找到它的实现。

但是,如果你真的想要像{J}那样分开%0A&,那么那里有所有概念和工具的Go类似物:

  • map[string]string是Go的模拟=
  • strings.Split可以为您分割Map<String, String>SplitN限制分割成的片段数,就像Java中的&的双参数版本一样。请注意,可能只有一个部分,因此您应该在尝试访问split()之前检查len(pieces)
  • for _, piece := range pieces将迭代您分割的部分。
  • Java代码似乎依赖正则表达式来修剪空格。 Go pieces[1]不使用它们,但strings.TrimSpace做了类似你想要的东西(具体来说,从两边剥离各种Unicode空格)。

我将离开实际的实现给你,但也许这些指针可以让你开始。

答案 1 :(得分:5)

import ( "strings" )

var m map[string]string
var ss []string

s := "A=B&C=D&E=F"
ss = strings.Split(s, "&")
m = make(map[string]string)
for _, pair := range ss {
    z := strings.Split(pair, "=")
    m[z[0]] = z[1]
}

这将做你想要的。

答案 2 :(得分:1)

golang net/url软件包本身提供了一种非常简单的方法。

更改您的字符串以使其成为带有查询参数text := "method://abc.xyz/A=B&C=D&E=F";的url

现在只需将此字符串传递给Parse提供的net/url函数。

import (
    netURL "net/url"
)
u, err := netURL.Parse(textURL)
        if err != nil {
            log.Fatal(err)
        }

现在u.Query()将返回一个包含查询参数的地图。这也适用于复杂类型。

答案 3 :(得分:0)

以下是几种方法的演示:

package main

import (
   "fmt"
   "net/url"
)

func main() {
   {
      q, e := url.ParseQuery("west=left&east=right")
      if e != nil {
         panic(e)
      }
      fmt.Println(q) // map[east:[right] west:[left]]
   }
   {
      u := url.URL{RawQuery: "west=left&east=right"}
      q := u.Query()
      fmt.Println(q) // map[east:[right] west:[left]]
   }
}