Unmarshal JSON с массивом - PullRequest
       39

Unmarshal JSON с массивом

0 голосов
/ 24 декабря 2018

Я пытаюсь разобрать следующий JSON-объект, который генерируется couchDB и возвращается для запроса cURL в Go. Код запроса cURL здесь не упоминается, поскольку он выходит за рамки этого вопроса, и я назначил его дляпеременная с именем mail в разделе кода.

структура данных JSON:

{
"total_rows": 4,
"offset": 0,
"rows": [{
              "id": "36587e5d091a0d49f739c25c0b000c05",
              "key": "36587e5d091a0d49f739c25c0b000c05",
              "value": {
                          "rev": "1-92471472a3de492b8657d3103f5f6e0d"
                       }
        }]
}

, и вот мой код, чтобы разобрать вышеприведенный объект JSON,

package main

import (
    "fmt"
    "encoding/json"
)

type Couchdb struct {
    TotalRows int `json:"total_rows"`
    Offset    int `json:"offset"`
    Rows      []struct {
        ID    string `json:"id"`
        Key   string `json:"key"`
        Value struct {
             Rev string `json:"rev"`
        } `json:"value"`
    } `json:"rows"`
}

func main() {
     mail := []byte(`{"total_rows":4,"offset":0,"rows":[{"id":"36587e5d091a0d49f739c25c0b000c05","key":"36587e5d091a0d49f739c25c0b000c05","value":{"rev":"1-92471472a3de492b8657d3103f5f6e0d"}}]}`)

     var s Couchdb
     err := json.Unmarshal(mail, &s)
     if err != nil {
         panic(err)
     }


     //fmt.Printf("%v", s.TotalRows)
     fmt.Printf("%v", s.Rows)
}

и приведенный выше код работает нормально, и вы можете получить доступ к рабочему коду здесь по этой ссылке в Go Play Ground.

Мне нужно получить значение 36587e5d091a0d49f739c25c0b000c05, которое является id из rows, поэтому я пытаюсь сделать это следующим образом

fmt.Printf("%v", s.Rows.ID)

и возвращает эту ошибку prog.go:33:25: s.Rows.ID undefined (type []struct { ID string "json:\"id\""; Key string "json:\"key\""; Value struct { Rev string "json:\"rev\"" } "json:\"value\"" } has no field or method ID)

, но она работает для fmt.Printf("%v", s.Rows) и он возвращает

[{36587e5d091a0d49f739c25c0b000c05 36587e5d091a0d49f739c25c0b000c05 {1-92471472a3de492b8657d3103f5f6e0d}}]

Моя конечная цель - получить 36587e5d091a0d49f739c25c0b000c05 и присвоить его переменной GO, но я застрял, получая это значение с помощью GO.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Вы определяете Rows как фрагмент структуры, что означает, что вы должны повторять строки с для для выполнения значений.

for _, item := range s.Rows {
        fmt.Println(item.ID)
} 
0 голосов
/ 24 декабря 2018

Вы должны позвонить:

fmt.Println(s.Rows[0].ID)
...