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 回复

请展示输入内容。

更多关于Golang中如何处理嵌套JSON数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Screenshot 2020-04-11 at 9.10.34 PM

以上是我的数据库行。我只获取第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和数据。

回到顶部