2016-07-06 7 views
-3

総囲碁初心者JSONレスポンスを解析、私は次のような構造Golangはここ

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

を持つLDAPサービスからの応答を解析しようとしている私はすべてのcn =値の元を収集する必要があります[group1、group2]や構造体のような[]文字列に変換します。

私が言ったように私は移動するための初心者であり、上記を達成するためのどのような指針にも感謝します。

+0

これを解析する方法が分かっていたなら、私はこの質問をしたことがありませんでした。 – krism70

答えて

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 = GROUP1、OU =グループ、DC =例、DC =ドメイン、dc = comの

私は=何かこの

のようにCNののoccuranceの長さを見つけることができると思います

回数:= strings.Count(文字列(ボディ)、「CN =」)

は、上記アレイの上に行くためにその数を使用しますが、まだいくつかの余分なロジックなしで私が持っているしたいアレイを得ることはありません。私はこれを行う道を忘れています

誰かがこれを行うためのより良い代替を指すことができれば感謝します。 クリス

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

+0

この行で範囲外のインデックスをスローします - > commonNames [i] = re.FindAllString(filter、1)[0] – krism70

+0

@ krism70は、すべてのラインがマッチしているとは限りません。一致の長さを確認し、その場合はスライスに追加することもできます。がんばろう! – AJcodez

+0

AJcodezありがとう、あなたのコードは私に必要なものを達成するための正しい方向性を提供しました – krism70

関連する問題