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

如何在Go语言中动态解析未知格式的JSON文件?

动态解析未知结构JSON的方法

针对未知且可能随时变化的JSON结构,完全不需要预定义结构体,所有主流编程语言的JSON处理库都支持动态解析,核心是将JSON转换为语言原生的动态数据结构(如字典、数组、通用对象),再通过类型判断、遍历或路径访问来操作值。以下是几种常用语言的实现方式:

Python

使用内置的json模块,解析后直接得到Python原生的dict/list嵌套结构,可直接通过键或索引访问,也能遍历所有内容:

import json

# 读取并解析JSON文件
with open("unknown.json", "r") as f:
    data = json.load(f)

# 动态处理数据
if isinstance(data, dict):
    # 按键访问,用get避免键不存在报错
    target_val = data.get("target_key")
    # 遍历所有键值对
    for key, val in data.items():
        print(f"{key}: {val}")
elif isinstance(data, list):
    # 遍历数组元素
    for idx, item in enumerate(data):
        print(f"索引{idx}: {item}")

Go语言

Go虽然是静态类型语言,但可通过interface{}或map[string]interface{}接收任意JSON数据,结合类型断言动态处理:

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("unknown.json")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    var data interface{}
    if err := json.NewDecoder(file).Decode(&data); err != nil {
        panic(err)
    }

    traverseJSON(data)
}

// 递归遍历JSON结构
func traverseJSON(val interface{}) {
    switch v := val.(type) {
    case map[string]interface{}:
        fmt.Println("JSON 对象:")
        for key, subVal := range v {
            fmt.Printf("  %s: ", key)
            traverseJSON(subVal)
        }
    case []interface{}:
        fmt.Println("JSON 数组:")
        for idx, subItem := range v {
            fmt.Printf("  索引%d: ", idx)
            traverseJSON(subItem)
        }
    default:
        fmt.Printf("%v\n", v)
    }
}

JavaScript/Node.js

JavaScript本身是动态类型语言,JSON.parse()直接将JSON转为JS对象/数组,可直接操作:

const fs = require('fs');

// 读取并解析JSON文件
const rawData = fs.readFileSync('unknown.json', 'utf8');
const data = JSON.parse(rawData);

// 动态遍历数据
if (typeof data === 'object' && !Array.isArray(data)) {
    // 处理JSON对象
    Object.entries(data).forEach(([key, val]) => {
        console.log(`${key}:`, val);
    });
} else if (Array.isArray(data)) {
    // 处理JSON数组
    data.forEach((item, idx) => {
        console.log(`索引${idx}:`, item);
    });
}

通用思路

所有方案的核心都是不依赖预定义结构,将JSON解析为语言原生的动态容器类型,通过类型判断、递归遍历或键/索引访问来获取目标值,完全适配结构未知或频繁变化的JSON文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:41:11