在JSON结构中解组数组

huangapple go评论72阅读模式
英文:

Unmarshalling arrays in JSON structure

问题

Stackoverflow:

我一直在努力解析一个在GO中并不算特别复杂的JSON响应(我对GO还比较新)。下面是一个示例:

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

我尝试将其表示为一个结构体数组,但似乎无法连接。

我在GO语言的playground上放了我的代码,如果有人能看一下,我将非常感激。

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

英文:

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

答案1

得分: 1

对于大型的 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{} 作为结构的起点。

英文:

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.

答案2

得分: 0

请将结构体更改如下。

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

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

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

你将会按照你编写的代码打印出目标ID。

{[{00u34k73otQGIAFUALPR}]}
英文:

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}]}

答案3

得分: 0

你需要修改你的结构体并使用以下示例代码:

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中查看这段代码。

英文:

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":"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)
}

Output:

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

Also you can check this code in https://play.golang.org/p/as9QJS4Cav

huangapple
  • 本文由 发表于 2016年11月26日 10:24:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/40814338.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定