Golang中如何处理嵌套JSON数据
Golang中如何处理嵌套JSON数据 我正在尝试用我的Go微服务打印一个嵌套的JSON。我已经查询了数据库并收集了响应。我想将每个ID的详细信息打印为嵌套的JSON。以下是详细信息。
我的代码:
type rresponse struct {
Set_ID []int64 `json:"set_id"`
Data_Set successresponse `json:"datasets"`
}
type successresponse struct {
LTST_VER_IND []string `json:"tst_ver_ind"`
DATA_TS []string `json:"data_ts"`
CREATN_TS []string `json:"creatn_ts"`
}
dataset := successresponse{
LTST_VER_IND: dataVal.LTST_VER_IND, //dataVal是数据库响应的对象。
DATA_TS: dataVal.DATA_TS,
CREATN_TS: dataVal.CREATN_TS,
}
response := &rresponse{
Set_ID: dataVal.SET_ID,
Data_Set: dataset,
}
rsp.WriteEntity(response)
jsonData, err := json.MarshalIndent(response, "", " ")
if err != nil {
log.Println(err)
}
以下是当前输出:
{ "set_id": [ 28, 29 ], "datasets": { "tst_ver_ind": [ "Y", "Y" ], "data_ts": [ "{\"String\":\"\",\"Valid\":false}", "{\"String\":\"\",\"Valid\":false}" ], "creatn_ts": [ "2020-04-03T20:37:41Z", "2020-04-03T21:11:54Z" ] } }
我期望的输出:
{
"set_id":[
28 {
"tst_ver_ind": "Y",
"data_ts": "{\"String\":\"\",\"Valid\":false}",
"creatn_ts": "2020-04-03T20:37:41Z",
},
29 {
"tst_ver_ind": "Y",
"data_ts": "{\"String\":\"\",\"Valid\":false}",
"creatn_ts": "2020-04-03T21:11:54Z",
},
],
}
你们能帮我修改代码以实现这个目标吗?
更多关于Golang中如何处理嵌套JSON数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复

以上是我的数据库行。我只获取第1、6、7、8列。我尝试在JSON中打印的内容,其JSON结构应如下所示。
{
set_id1 [
col1: value1,
col2: value2,
col3: value3,
],
set_id2 [
col1: value1,
col2: value2,
col3: value3,
],
set_id3 [
col1: value1,
col2: value2,
col3: value3,
]
}
要实现你期望的嵌套JSON结构,需要重新设计数据结构。当前的结构是分开的数组,而你需要的是每个set_id对应一个完整的数据对象。
以下是修改后的代码:
type Item struct {
TSTVerInd string `json:"tst_ver_ind"`
DataTS string `json:"data_ts"`
CreatnTS string `json:"creatn_ts"`
}
type Response struct {
SetID []map[int64]Item `json:"set_id"`
}
func main() {
// 假设dataVal包含数据库响应数据
// 这里需要根据你的实际数据结构调整
var responseItems []map[int64]Item
// 遍历每个set_id创建对应的Item
for i, id := range dataVal.SET_ID {
item := Item{
TSTVerInd: dataVal.LTST_VER_IND[i],
DataTS: dataVal.DATA_TS[i],
CreatnTS: dataVal.CREATN_TS[i],
}
// 创建map,key为set_id,value为Item
itemMap := map[int64]Item{
id: item,
}
responseItems = append(responseItems, itemMap)
}
response := &Response{
SetID: responseItems,
}
// 使用MarshalIndent格式化输出
jsonData, err := json.MarshalIndent(response, "", " ")
if err != nil {
log.Println(err)
}
fmt.Println(string(jsonData))
}
或者使用更简洁的结构:
type Dataset struct {
TSTVerInd string `json:"tst_ver_ind"`
DataTS string `json:"data_ts"`
CreatnTS string `json:"creatn_ts"`
}
type Response struct {
SetID map[int64]Dataset `json:"set_id"`
}
func main() {
datasets := make(map[int64]Dataset)
// 假设数组长度相同
for i := 0; i < len(dataVal.SET_ID); i++ {
dataset := Dataset{
TSTVerInd: dataVal.LTST_VER_IND[i],
DataTS: dataVal.DATA_TS[i],
CreatnTS: dataVal.CREATN_TS[i],
}
datasets[dataVal.SET_ID[i]] = dataset
}
response := &Response{
SetID: datasets,
}
jsonData, err := json.MarshalIndent(response, "", " ")
if err != nil {
log.Println(err)
}
fmt.Println(string(jsonData))
}
第二种方案输出的JSON格式为:
{
"set_id": {
"28": {
"tst_ver_ind": "Y",
"data_ts": "{\"String\":\"\",\"Valid\":false}",
"creatn_ts": "2020-04-03T20:37:41Z"
},
"29": {
"tst_ver_ind": "Y",
"data_ts": "{\"String\":\"\",\"Valid\":false}",
"creatn_ts": "2020-04-03T21:11:54Z"
}
}
}
如果你坚持要完全按照你期望的格式(set_id作为数组,每个元素是包含ID和对象的map),使用第一种方案。第二种方案更符合常见的JSON结构,使用map而不是数组来关联ID和数据。

