Переполнение стека:

Я изо всех сил пытался демаршалировать то, что я бы не считал особенно сложным ответом JSON в GO. (в котором я новичок). Пример ниже:

{ "eventId": "tevtNKIsHrFQTyyMeYDMc5jgQ1459184873000", 
  "sessionId": "1016Q-vnpnlQwCiLiyH7e_cNg", 
  "targets": 
     [ { "id": "00u34k73otQGIAFUALPR", "displayName": "okta admin", "login":       "oktaadmin@okta.com", "objectType": "User" } ] }

Я попытался представить это как массив структур, но, похоже, он никогда не подключается.

Я разместил свой код на игровой площадке GO Lang, если кто-нибудь сможет взглянуть, я был бы очень признателен.

https://play.golang.org/p/TVYeYe7e_I

1
user3888307 26 Ноя 2016 в 05:24

3 ответа

Лучший ответ

Для больших документов json я рекомендую вам использовать этот инструмент: https://mholt.github.io / json-to-go /

Вы получите что-то вроде:

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"`
}

Полный пример: https://play.golang.org/p/Q8PwwtS_QZ

Также вы всегда можете начать с map[string]interface{} вместо структуры.

1
Yandry Pozo 26 Ноя 2016 в 02:54

Измените структуру, как показано ниже.

type  zMessage  struct {
        Message string `json:"message"`
    }

    type zTargets struct {
        Idtarget string `json:"id"`
    }


    var  val  struct {       
        Targets [] zTargets `json:"targets"`         

    }

Вы получите целевой идентификатор, напечатанный, как вы кодировали.

{[{00u34k73otQGIAFUALPR}]}
0
notionquest 26 Ноя 2016 в 02:56

Вам нужно изменить свои структуры и использовать код, подобный этому примеру:

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":"oktaadmin@okta.com",
                "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)
}

Выход:

eventId: tevtNKIsHrFQTyyMeYDMc5jgQ1459184873000
sessionID: 1016Q-vnpnlQwCiLiyH7e_cNg
targets.id: 00u34k73otQGIAFUALPR
targets.displayName: okta admin
targets.login: oktaadmin@okta.com
targets.objectType: User

Также вы можете проверить этот код в https://play.golang.org/p/as9QJS4Cav

0
Chiheb Nexus 26 Ноя 2016 в 03:05