Golang生成合法JSON数组问题:单条JSON无分隔符与包裹方括号
解决Golang生成合法JSON数组的问题
我来帮你搞定这个生成合法JSON数组的问题!你现在的代码只是循环输出单个JSON对象,没有用方括号包裹,也没加逗号分隔,所以不是标准的JSON数组格式。这里有两种实用的解决方案,你可以根据实际场景选择:
方案一:先收集所有数据再序列化(适合小数据量)
如果从SQL取出的数据量不大,可以先把所有对象放到切片里,再用json.Marshal直接序列化整个切片——标准库会自动帮你处理数组的方括号和逗号分隔,省心又不容易出错:
package main import ( "encoding/json" "fmt" ) func main() { // 模拟从SQL查询到的多条用户数据 userList := []map[string]string{ {"USER_ID": "JD", "USER_NAME": "John Doe"}, {"USER_ID": "JD", "USER_NAME": "John Doe"}, {"USER_ID": "JD", "USER_NAME": "John Doe"}, {"USER_ID": "JD", "USER_NAME": "John Doe"}, } // 直接序列化整个切片为合法的JSON数组 jsonResult, err := json.Marshal(userList) if err != nil { fmt.Printf("JSON序列化失败: %v\n", err) return } fmt.Println(string(jsonResult)) }
运行这段代码会直接输出标准JSON数组:
[{"USER_ID":"JD","USER_NAME":"John Doe"},{"USER_ID":"JD","USER_NAME":"John Doe"},{"USER_ID":"JD","USER_NAME":"John Doe"},{"USER_ID":"JD","USER_NAME":"John Doe"}]
方案二:流式构建JSON数组(适合大数据量)
如果从SQL取出的数据量很大,不想把所有数据都加载到内存里,可以手动流式输出JSON数组的结构:先输出开头的[,然后循环输出每个序列化后的对象,除了第一个对象外,前面加逗号,最后输出结尾的]:
package main import ( "encoding/json" "fmt" ) func main() { // 输出数组开头 fmt.Print("[") for i := 0; i < 4; i++ { // 模拟从SQL逐行读取的数据 user := map[string]string{ "USER_ID": "JD", "USER_NAME": "John Doe", } userJson, err := json.Marshal(user) if err != nil { fmt.Printf("\nJSON序列化失败: %v\n", err) return } // 除了第一个元素,前面加逗号分隔 if i > 0 { fmt.Print(",") } // 输出当前对象的JSON fmt.Print(string(userJson)) } // 输出数组结尾并换行 fmt.Println("]") }
这种方式的好处是内存占用低,适合处理大量数据的场景,比如从SQL分批读取数据时,边读边输出。
内容的提问来源于stack exchange,提问作者sibert
相关产品推荐
相关产品推荐

