user3888307
user3888307

Reputation: 3113

Unmarshalling arrays in JSON structure

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

Answers (3)

Chiheb Nexus
Chiheb Nexus

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

notionquest
notionquest

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

Yandry Pozo
Yandry Pozo

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

Related Questions