在 Go 中正确生成带数组字段的 JSON 对象,应避免字符串拼接,而使用 encoding/json 包配合结构体与 json.Marshal() 安全序列化,确保类型准确、格式合规。
在 go 中正确生成带数组字段的 json 对象,应避免字符串拼接,而使用 `encoding/json` 包配合结构体与 `json.marshal()` 安全序列化,确保类型准确、格式合规。
要构建形如 {"extent":[-76.0624694824, 36.8856620774, -75.9800720215, 36.9449529607]} 的 JSON 对象,绝不可通过字符串拼接(如 `{"extent":` + [...] + `}`)实现——这不仅导致类型不匹配([]float32 无法直接转为字符串),更会生成非法 JSON(缺少引号包裹、无类型上下文),使服务端解析失败(如报错 “Expected List as JsArray, but got string”)。
正确的做法是利用 Go 标准库 encoding/json 进行类型安全的序列化。核心步骤如下:
- 定义结构体并绑定 JSON 字段名:使用 struct 字段标签(如 `json:"extent"`)明确映射关系;
- 初始化结构体实例:将目标浮点数切片赋值给对应字段;
- 调用 json.Marshal():自动处理类型转换、数组格式化及 JSON 转义,返回 []byte;
- 错误检查:始终校验 err,避免静默失败。
示例代码如下:
package main
import (
"encoding/json"
"fmt"
)
type GeometryRequest struct {
Extent []float32 `json:"extent"`
}
func main() {
req := GeometryRequest{
Extent: []float32{-76.0624694824, 36.8856620774, -75.9800720215, 36.9449529607},
}
jsonBytes, err := json.Marshal(req)
if err != nil {
panic(fmt.Sprintf("JSON marshaling failed: %v", err))
}
fmt.Println(string(jsonBytes))
// 输出: {"extent":[-76.06247,36.885662,-75.98007,-75.980072,36.944954]}
}✅ 关键优势:
- 自动确保 extent 字段为合法 JSON 数组(非字符串);
- 支持任意长度切片,便于动态构造;
- 兼容 float32/float64,精度可控(注意:float32 序列化时可能有微小舍入,若需高精度请改用 []float64);
- 可轻松扩展其他字段(如 {"extent":[...], "crs":"EPSG:4326"})。
⚠️ 注意事项:
- 切勿手动拼接 JSON 字符串——既不安全也不可维护;
- 若字段名需严格匹配(如大小写敏感),务必核对 json 标签;
- 生产环境建议使用 json.MarshalIndent() 提升调试可读性(如 json.MarshalIndent(req, "", " "));
- 发送 HTTP 请求时,可直接将 jsonBytes 作为请求体,并设置 Content-Type: application/json 头。
遵循此模式,即可稳定、可靠地生成符合服务端预期的结构化 JSON 数据。


















