英文:
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.
答案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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论