如何在未知 JSON 结构下动态添加字段并重新序列化

落强小哥_5849

落强小哥_5849

2026-09-09

493人浏览

原创

如何在未知 JSON 结构下动态添加字段并重新序列化

本文介绍在 Go 中无需预定义结构体即可解析任意 JSON 数据,向其中安全插入新字段(如 "count"),再生成标准 JSON 字符串的完整实践方案。

本文介绍在 go 中无需预定义结构体即可解析任意 json 数据,向其中安全插入新字段(如 `"count"`),再生成标准 json 字符串的完整实践方案。

在实际开发中,我们常需处理结构不固定、来源不可控的 JSON 数据——例如第三方 API 返回、用户自定义配置或动态表单提交内容。此时若强行使用结构体反序列化(json.Unmarshal(in, &myStruct))会因字段缺失、嵌套变化或类型不一致而失败。Go 标准库提供了更灵活的解决方案:使用 map[string]interface{} 作为通用容器进行无损解析与修改。

该方法利用 Go 的 interface{} 类型承载任意 JSON 值(字符串、数字、布尔、对象、数组等),配合 map[string]interface{} 模拟 JSON 对象层级。解析后可像操作普通 map 一样增删改查键值,最后通过 json.Marshal() 安全转回 JSON 字节流。

以下为完整示例代码:

Comprehensive Three.js 3D graphics reference
Comprehensive Three.js 3D graphics reference

详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。

下载
package main

import (
    "encoding/json"
    "fmt"
)

func addCountField(jsonStr string) (string, error) {
    var raw map[string]interface{}
    if err := json.Unmarshal([]byte(jsonStr), &raw); err != nil {
        return "", fmt.Errorf("failed to unmarshal JSON: %w", err)
    }

    // 安全插入 count 字段(值为整数,JSON 序列化时自动转为数字)
    raw["count"] = 1

    // 重新序列化为格式化 JSON 字符串(可选:使用 json.MarshalIndent 获得缩进)
    result, err := json.Marshal(raw)
    if err != nil {
        return "", fmt.Errorf("failed to marshal JSON: %w", err)
    }

    return string(result), nil
}

func main() {
    input := `{"votes": {"option_A": "3"}}`
    output, err := addCountField(input)
    if err != nil {
        panic(err)
    }
    fmt.Println(output) // 输出:{"count":1,"votes":{"option_A":"3"}}
}

✅ 关键注意事项:

  • map[string]interface{} 只能表示 JSON 对象(即 {}),若原始 JSON 是数组([])、字符串或数字,需改用 interface{} 顶层变量;
  • 所有 JSON 数字默认反序列化为 float64,如需精确整数操作,请显式类型断言或使用 json.Number;
  • 修改嵌套结构(如在 votes 内部添加字段)需先判断子 map 是否存在并做类型断言:if votes, ok := raw["votes"].(map[string]interface{}); ok { votes["new_key"] = "value" };
  • 生产环境建议增加输入校验(如非空、合法 JSON 格式)和错误处理,避免 panic。

该方案兼顾简洁性与健壮性,是处理动态 JSON 的推荐实践。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1975

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2682

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

916

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

2999

7

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.06

2329

5

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

2023.09.25

4567

6

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.13

622

5

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

2023.10.26

6305

20

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2136

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习