Reputation: 3113
Stackoverflow:
I've been struggling to unmarshal what I wouldn't consider an especially complex JSON response in GO. (which I'm fairly new to). Example below:
{ "eventId": "tevtNKIsHrFQTyyMeYDMc5jgQ1459184873000",
"sessionId": "1016Q-vnpnlQwCiLiyH7e_cNg",
"targets":
[ { "id": "00u34k73otQGIAFUALPR", "displayName": "okta admin", "login": "[email protected]", "objectType": "User" } ] }
I tried representing this as an array of structs, but it never seems to connect.
I put my code on the GO Lang playground, if anyone can take a look I'd be very appreciative.
https://play.golang.org/p/TVYeYe7e_I
Upvotes: 1
Views: 96
Reputation: 9257
You need to modify your structs and use a code like this example:
package main
import (
"encoding/json"
"fmt"
)
type MyJSON struct {
EventID string `json:"eventID"`
SessionID string `json:"sessionID"`
Targets []MyTargets `json:"targets"`
}
type MyTargets struct {
Id string `json:"id"`
DisplayName string `json:"displayName"`
Login string `json:"login"`
ObjectType string `json:"objectType"`
}
func main() {
myJson := []byte(`{
"eventId": "tevtNKIsHrFQTyyMeYDMc5jgQ1459184873000",
"sessionId": "1016Q-vnpnlQwCiLiyH7e_cNg",
"targets": [
{
"id": "00u34k73otQGIAFUALPR",
"displayName": "okta admin",
"login":"[email protected]",
"objectType": "User"
}
]
}`)
myStruct := MyJSON{}
json.Unmarshal(myJson, &myStruct)
fmt.Printf(`
eventId: %s
sessionID: %s
targets.id: %s
targets.displayName: %s
targets.login: %s
targets.objectType: %s
`, myStruct.EventID, myStruct.SessionID,
myStruct.Targets[0].Id,
myStruct.Targets[0].DisplayName,
myStruct.Targets[0].Login,
myStruct.Targets[0].ObjectType)
}
Output:
eventId: tevtNKIsHrFQTyyMeYDMc5jgQ1459184873000
sessionID: 1016Q-vnpnlQwCiLiyH7e_cNg
targets.id: 00u34k73otQGIAFUALPR
targets.displayName: okta admin
targets.login: [email protected]
targets.objectType: User
Also you can check this code in https://play.golang.org/p/as9QJS4Cav
Upvotes: 0
Reputation: 39196
Please change the struct as below.
type zMessage struct {
Message string `json:"message"`
}
type zTargets struct {
Idtarget string `json:"id"`
}
var val struct {
Targets [] zTargets `json:"targets"`
}
You will get the target id printed as you coded.
{[{00u34k73otQGIAFUALPR}]}
Upvotes: 0
Reputation: 5123
For big json documents I recommend you to use this tool: https://mholt.github.io/json-to-go/
You will get something like:
type AutoGenerated struct {
EventID string `json:"eventId"`
SessionID string `json:"sessionId"`
RequestID string `json:"requestId"`
Published time.Time `json:"published"`
Action struct {
Message string `json:"message"`
Categories []string `json:"categories"`
ObjectType string `json:"objectType"`
RequestURI string `json:"requestUri"`
} `json:"action"`
Actors []struct {
ID string `json:"id"`
DisplayName string `json:"displayName"`
Login string `json:"login,omitempty"`
ObjectType string `json:"objectType"`
IPAddress string `json:"ipAddress,omitempty"`
} `json:"actors"`
Targets []struct {
ID string `json:"id"`
DisplayName string `json:"displayName"`
Login string `json:"login"`
ObjectType string `json:"objectType"`
} `json:"targets"`
}
Full example: https://play.golang.org/p/Q8PwwtS_QZ
Also you can always start with a map[string]interface{}
instead of a struct.
Upvotes: 1