Golang解析json响应

时间:2016-07-06 02:28:20

标签: parsing go ldap

总计新手入门,我正在尝试解析来自具有以下结构的LDAP服务的响应

 {
      "isMemberOf": [
       “cn=group1,ou=groups,dc=example,dc=domain,dc=com",
       “cn=group2,ou=groups,dc=example,dc=domain,dc=com",
       "cn=.............................................,
       "cn=.............................................
       ]
    }

我需要将所有cn =值ex:group1,group2收集到像[group1,group2]这样的[]字符串或结构中。

正如我所说,我是Go的全新手,并会欣赏有关如何实现上述目标的任何指示。

2 个答案:

答案 0 :(得分:0)

    struct type UserGroups struct {
        IsMemberOf []string `json:"isMemberOf"`
    }
//part of main code 
//receive the response from the service
     body, err := ioutil.ReadAll(res.Body)
        if err != nil {
           panic(err.Error())
        }

      s, err := getUserGroups([]byte(body))
     fmt.Println(s.IsMemberOf[0])


//end main code
//function to read user groups
   func getUserGroups(body []byte) (*UserGroups, error) {
    var s = new(UserGroups)
    err := json.Unmarshal(body, &s)
    if(err != nil){
        fmt.Println("whoops:", err)
    }
    return s, err
    }

//输出 CN = 1组,OU =基团,DC =例如,DC =域,DC = com的

我想我可以找到cn的出现时间=这样的事情

count:= strings.Count(string(body)," cn =")

然后使用该计数来检查上面的数组,但仍然不会得到我想要的数组而没有一些额外的逻辑。我错过了这样做的方法

感谢是否有人可以指出更好的替代方案来做到这一点。

感谢 克里斯

答案 1 :(得分:0)

首先,您需要解析json encoded数据。

import "encoding/json"

data := []byte(`
{
  "isMemberOf": [
    "cn=group1,ou=groups,dc=example,dc=domain,dc=com",
    "cn=group2,ou=groups,dc=example,dc=domain,dc=com",
    "cn=.............................................,
    "cn=.............................................
  ]
}
`)

var input struct {
    Items []string `json:"isMemberOf"`
}

err := json.Unmarshal(data, &input)
if err != nil {
    panic(err)
}

下一步是解析每个单独的LDAP过滤器。您可以使用regexp作为用例。

import "regexp"

var re = regexp.MustCompile("cn=([a-z0-9]+)")

commonNames := make([]string, len(input.Items))
for i, filter := range input.Items {
  commonNames[i] = re.FindAllString(filter, 1)[0]
}

// commonNames has the values you want

不幸的是,LDAP搜索过滤器can have fancy syntax,因此您可能需要实现正确的解析器。例如Here's one in ruby