You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go如何使用Unmarshal解析含字符串与整数混合类型无键数组的JSON数据

Go解析混合类型嵌套JSON数组的正确实现

问题核心

你遇到的问题根因是JSON中a字段的子数组包含两种不同类型的元素:第一个为字符串、第二个为整数,Go是静态类型语言,直接声明[][]string类型无法兼容整数,会导致数值丢失。


方案1:使用空接口实现快速解析

如果不需要严格的类型校验,直接将a字段声明为[][]interface{}类型,解析后通过类型断言获取对应值即可:

package main

import (
	"encoding/json"
	"fmt"
)

type StructJson struct {
	A [][]interface{} `json:"a"`
}

func main() {
	XJson := `
    {
      "a": [
            ["aaa",15],
            ["bbb",11]
        ]
    }`

	var output StructJson
	err := json.Unmarshal([]byte(XJson), &output)
	if err != nil {
		fmt.Println("解析错误:", err)
		return
	}
	fmt.Println(output)
	// 取值示例
	for _, item := range output.A {
		strVal := item[0].(string)
		numVal := item[1].(float64) // json解析数字默认是float64类型,如需int可强转
		fmt.Printf("字符串:%s,数值:%d\n", strVal, int(numVal))
	}
}

方案2:自定义反序列化接口(类型安全,推荐)

如果明确子数组固定为「字符串+整数」的结构,可自定义结构体实现json.Unmarshaler接口,代码更健壮,避免频繁类型断言:

package main

import (
	"encoding/json"
	"fmt"
)

// 自定义子元素结构体,对应每个二维数组的子项
type ArrayItem struct {
	Str string
	Num int
}

// 实现json.Unmarshaler接口
func (ai *ArrayItem) UnmarshalJSON(data []byte) error {
	var tmp []interface{}
	if err := json.Unmarshal(data, &tmp); err != nil {
		return err
	}
	// 类型转换
	ai.Str = tmp[0].(string)
	ai.Num = int(tmp[1].(float64))
	return nil
}

type StructJson struct {
	A []ArrayItem `json:"a"`
}

func main() {
	XJson := `
    {
      "a": [
            ["aaa",15],
            ["bbb",11]
        ]
    }`

	var output StructJson
	err := json.Unmarshal([]byte(XJson), &output)
	if err != nil {
		fmt.Println("解析错误:", err)
		return
	}
	// 直接使用类型明确的字段,无需断言
	fmt.Println(output)
	for _, item := range output.A {
		fmt.Printf("字符串:%s,数值:%d\n", item.Str, item.Num)
	}
}

运行上述代码可以得到正确的解析结果,不会丢失整数数据。

内容的提问来源于stack exchange,提问作者ekomonimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:54:03