Go에서 깊게 중첩된 JSON 키 및 값에 액세스
Go로 작성된 다음 websocket 클라이언트 코드를 고려하세요.
import ( "encoding/json" "log" ) func main() { msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}` var u map[string]interface{} err := json.Unmarshal([]byte(msg), &u) if err != nil { log.Fatalf("Failed to unmarshal: %v\n", err) } args := u["args"] // Attempting to directly access the time key will throw an error log.Println(args[0]["time"]) // invalid notation }
이 시나리오에서는 깊게 중첩된 "time" 키에 액세스할 때 부적절한 표기로 인해 "잘못된 작업: args[0] (인터페이스 {} 유형의 인덱스)" 오류가 발생합니다.
해결책
권장되는 솔루션은 JSON 데이터 구조의 탐색을 단순화하는 github.com/bitly/go-simplejson 패키지를 활용하는 것입니다. 자세한 내용은 http://godoc.org/github.com/bitly/go-simplejson 문서를 참조하세요.
이 패키지를 위 코드에 적용:
// Import go-simplejson import "github.com/bitly/go-simplejson" func main() { // Create a JSON object json := simplejson.New() json.Decode([]byte(msg)) // Using go-simplejson, access the time key time, err := json.Get("args").GetIndex(0).String("time") if err != nil { log.Fatalf("Failed to get time: %v\n", err) } log.Println(time) // Returns the time value }
원래 질문의 두 번째 부분인 Go 구조체를 선언하려면 사용자 정의 마샬러 및 역마샬러가 필요하며, 여기에는 인코딩.TextMarshaler 및 인코딩.TextUnmarshaler 인터페이스 구현이 포함됩니다. 그러나 go-simplejson과 같은 JSON 라이브러리를 사용하면 이 프로세스가 단순화됩니다.
위 내용은 사용자 정의 마샬러 및 역마샬러를 사용하지 않고 Go에서 깊게 중첩된 JSON 키와 값에 어떻게 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!