Golang中如何将sync.Map转换为JSON

Golang中如何将sync.Map转换为JSON 我正在尝试使用 json.Marshal 将 sync.Map 转换为 JSON,但得到了空的 JSON 结果 “{}”。

示例: https://play.golang.org/p/HNzOuuMQt21

我正在寻找一种将 sync.Map 转换为 JSON 的解决方案,而不是先将其转换为 Map(遍历 sync.Map 并将键值复制到 Map),然后再将 Map 转换为 JSON。

谢谢 🙂

3 回复

可能在编码前需要先进行转换。https://play.golang.org/p/PdSjIcV8iJh

更多关于Golang中如何将sync.Map转换为JSON的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这正是我想要避免的情况,我想没有其他解决方案了……

谢谢!

在 Go 中,sync.Map 类型没有实现 json.Marshaler 接口,因此直接使用 json.Marshal 会返回空对象 {}。你需要自定义一个类型来包装 sync.Map 并实现 MarshalJSON 方法。以下是一个解决方案,避免显式遍历并复制到普通 map,而是通过自定义 JSON 序列化逻辑直接处理。

示例代码:

package main

import (
	"encoding/json"
	"sync"
)

// JSONSyncMap 包装 sync.Map 并实现 json.Marshaler
type JSONSyncMap struct {
	m sync.Map
}

// MarshalJSON 实现自定义 JSON 序列化
func (j *JSONSyncMap) MarshalJSON() ([]byte, error) {
	tempMap := make(map[string]interface{})
	j.m.Range(func(key, value interface{}) bool {
		// 假设键为字符串类型,否则需要类型断言或处理
		if strKey, ok := key.(string); ok {
			tempMap[strKey] = value
		}
		return true
	})
	return json.Marshal(tempMap)
}

// 示例使用
func main() {
	var sm JSONSyncMap
	sm.m.Store("name", "Alice")
	sm.m.Store("age", 30)

	data, err := json.Marshal(&sm)
	if err != nil {
		panic(err)
	}
	println(string(data)) // 输出: {"age":30,"name":"Alice"}
}

此代码定义了一个 JSONSyncMap 类型,它内嵌了 sync.Map 并实现了 MarshalJSON 方法。在序列化时,它遍历 sync.Map 的键值对并构建一个临时 map,然后对该 map 进行 JSON 编码。这避免了在外部代码中手动复制到普通 map 的步骤,同时保持了 sync.Map 的并发安全性。注意,此示例假设键为字符串类型;如果键类型不同,需调整类型断言或处理逻辑。

回到顶部