如何正确地将 JSON 字段封装为单个对象并高效管理数据

云磊同学_3615

云磊同学_3615

2026-10-26

317人浏览

原创

如何正确地将 JSON 字段封装为单个对象并高效管理数据

本文讲解如何避免生成非法的多行 json(即多个独立 json 对象),通过将所有字段统一封装进一个 json 数组对象中,并提供安全、可扩展的读写方案。

本文讲解如何避免生成非法的多行 json(即多个独立 json 对象),通过将所有字段统一封装进一个 json 数组对象中,并提供安全、可扩展的读写方案。

在 Go 中处理 JSON 文件时,一个常见误区是:每次追加新数据都直接 json.Marshal 后写入文件末尾——这会导致文件内容变成多个彼此独立的 JSON 对象(如 {"a":1}{"b":2}),而标准 JSON 规范只允许一个顶层值(如单个对象 {} 或数组 [])。因此,当你尝试用 json.Unmarshal 解析该文件时,会遇到 invalid character '{' after top-level value 错误。

正确的做法是:始终将所有数据维护在一个 JSON 数组中。例如,合法结构应为:

[
  {"Date":"2017-03-20 10:46:48","Description":"new"},
  {"Date":"2017-03-20 10:46:51","Description":"new .go"}
]

而非两行独立对象。

✅ 推荐实现方式(安全、清晰、符合 Go 惯例)

type Reminder struct {
    Date        string `json:"Date"`
    Description string `json:"Description"`
}

func appendReminder(filename string, r Reminder) error {
    // 1. 读取现有数据(若文件不存在则初始化为空切片)
    data, err := os.ReadFile(filename)
    if err != nil && !os.IsNotExist(err) {
        return fmt.Errorf("read file: %w", err)
    }

    var reminders []Reminder
    if len(data) > 0 {
        if err := json.Unmarshal(data, &reminders); err != nil {
            return fmt.Errorf("parse existing JSON: %w", err)
        }
    }

    // 2. 追加新条目
    reminders = append(reminders, r)

    // 3. 重新序列化并完整写入(覆盖原文件)
    newData, err := json.MarshalIndent(reminders, "", "  ")
    if err != nil {
        return fmt.Errorf("marshal JSON: %w", err)
    }

    if err := os.WriteFile(filename, newData, 0644); err != nil {
        return fmt.Errorf("write file: %w", err)
    }

    return nil
}

调用示例:

Json Repair Kit
Json Repair Kit

使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

下载
err := appendReminder("rem.json", Reminder{
    Date:        time.Now().Format("2006-01-02 15:04:05"),
    Description: "Meeting with team",
})
if err != nil {
    log.Fatal(err)
}

⚠️ 注意事项与优化建议

  • 原子性与并发安全:上述实现非并发安全。若需多 goroutine 写入,请加 sync.Mutex 或使用文件锁(如 syscall.Flock)。
  • 大文件性能优化:当 rem.json 达到 MB 级别且写入频繁时,全量读写开销增大。此时可考虑:
    • 使用轻量级嵌入式数据库(如 BoltDB 或 SQLite);
    • 或采用“流式追加 + 索引重建”策略(不推荐手动截断 ] 并拼接,易出错且破坏 JSON 可读性与工具兼容性)。
  • 错误处理不可省略:示例中已包含关键错误链式包装(%w),便于调试定位问题源头。
  • JSON 格式可读性:使用 json.MarshalIndent(..., "", " ") 生成带缩进的格式化输出,方便人工查看与 Git diff。

✅ 验证与遍历数据

加载并遍历所有提醒项非常直观:

data, _ := os.ReadFile("rem.json")
var reminders []Reminder
json.Unmarshal(data, &reminders)

for i, r := range reminders {
    fmt.Printf("[%d] %s: %s\n", i, r.Date, r.Description)
}

总结:永远让 JSON 文件保持单一合法顶层值(推荐数组),避免“逐行 JSON”陷阱;以“读—改—写”模式维护数据一致性,兼顾正确性与可维护性。

相关文章

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

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

下载

相关标签:

js json

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

相关专题

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

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

2023.08.07

2175

5

json是什么
json是什么

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

2023.08.23

3402

1

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

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

2023.10.13

1136

3

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

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

2025.09.10

3899

7

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

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

2023.09.06

3029

5

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

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

2023.09.25

6027

6

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

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

2023.10.13

722

5

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

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

2023.10.26

7805

20

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

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

2024.02.23

2836

5

热门下载

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

精品课程

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

共101课时 | 21.1万人学习

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

共39课时 | 4.9万人学习