Golang处理JSON响应数据时遇到的常见问题

Golang处理JSON响应数据时遇到的常见问题 问候大家,周五快乐!

我正在尝试获取JSON响应中的嵌套数据,但显然遗漏了某些内容。我的结构体如下所示:

type MyInformation struct {
	MyResults []struct {
		MoreData []struct {
			Name    string          `json:"name"`
			Tags    interface{}     `json:"tags"`
			Columns []string        `json:"columns"`
			Values  [][]interface{} `json:"values"`
		} `json:"moredata"`
	} `json:"myresults"`
}

如果我有…

//
var myResponseData []MyInformation
//
for i := range myResponseData {
		fmt.Fprintf(myOutputData, "%v\n", myResponseData[i].MyResults)
}

我可以看到MyResults,但似乎看不到其他任何内容(特别是"Values")。有什么想法吗?

提前感谢!


更多关于Golang处理JSON响应数据时遇到的常见问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感谢您的友好回复!

更多关于Golang处理JSON响应数据时遇到的常见问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


type MyInformation struct {
    MyResults []struct {
        MoreData []struct {
            Name string json:"name"
            Tags interface{} json:"tags"
            Columns []string json:"columns"
            Values [][]interface{} json:"values"
         } json:"moredata"
    } json:"myresults"
}

//
var myResponseData []MyInformation
//
for i := range myResponseData {
    fmt.Fprintf(myOutputData, “%v\n”, myResponseData[i].MyResults)
}

我认为你不应该对任何这些内容使用空接口。你应该尝试使用字符串切片来处理标签,并使用你期望接收的值的相应类型。

在处理JSON响应中的嵌套数据时,常见问题通常与结构体定义、JSON标签匹配或数据访问方式有关。根据您提供的代码,问题可能出现在如何正确访问嵌套字段上。

以下是针对您代码的分析和解决方案:

问题分析

  1. 您的结构体MyInformation正确映射了JSON字段,但循环中仅打印了MyResults,这是一个切片,其中每个元素包含MoreData字段。
  2. 要访问Values,您需要进一步遍历MyResults中的每个元素,然后遍历MoreData中的每个元素。

示例代码

type MyInformation struct {
	MyResults []struct {
		MoreData []struct {
			Name    string          `json:"name"`
			Tags    interface{}     `json:"tags"`
			Columns []string        `json:"columns"`
			Values  [][]interface{} `json:"values"`
		} `json:"moredata"`
	} `json:"myresults"`
}

// 假设 myResponseData 已从JSON解析填充
var myResponseData []MyInformation

// 遍历 MyInformation 切片
for _, info := range myResponseData {
    // 遍历每个 MyResults
    for _, result := range info.MyResults {
        // 遍历每个 MoreData
        for _, data := range result.MoreData {
            // 现在可以访问 Values 字段
            fmt.Fprintf(myOutputData, "Values: %v\n", data.Values)
            // 如果需要打印其他字段,例如 Name
            fmt.Fprintf(myOutputData, "Name: %s\n", data.Name)
        }
    }
}

说明

  • 使用嵌套循环来访问MyResultsMoreData中的每个元素。
  • data.Values将返回[][]interface{}类型的数据,您可以根据需要进一步处理。
  • 如果JSON响应中某些字段可能为空或缺失,建议添加错误检查,例如在访问前验证切片是否为空。

如果JSON数据未正确解析到结构体中,请确保JSON键与结构体标签完全匹配(包括大小写)。例如,moredata在JSON中必须是小写,否则使用json.Unmarshal时会忽略该字段。

回到顶部