总计新手入门,我正在尝试解析来自具有以下结构的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的全新手,并会欣赏有关如何实现上述目标的任何指示。
答案 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。