如何在 Go 中构建嵌套的动态 JSON

how to build a nested, dynamic JSON in Go

我正在用 Go 编写一个简单的 API,它从数据库中读取并输出 GeoJSON。

我有这个用于简单的点。但是我的一些数据是线(linestring)。我想要一个通用的 GeoJSON 结构定义。然而,正如 GeoJSON 中指定的那样,“Features”元素有一个“Coordinates”子元素,它包含一个 [2]float32 点坐标,或者一个 array线和多边形的点数。

有没有办法用这种方式在 Go 中定义一个结构体?我来自 PHP,如果使用弱类型数组,那将是微不足道的。

如果我不能用结构体来做 - 除了拼凑一个字符串还有什么是 Go 中的正确方法?

注意:类似的问题都是关于解组动态的JSON。我需要从数据库内容中构建一个。

您可以创建一个 map[string]any,为 Coordinates 设置它的值,然后整理它。 例如:

package main

import (
    "encoding/json"
    "fmt"
)

type Point struct {
    X, Y int
}

func main() {
    m := map[string]any{}
    var singleCoordinate bool
    if singleCoordinate {
        m["Coordinates"] = []float32{1, 2}
    } else {
        m["Coordinates"] = []Point{{X: 1, Y: 2}, {X: 2, Y: 2}}
    }
    data, err := json.Marshal(m)
    fmt.Println(string(data), err)
}

游乐场:https://go.dev/play/p/8mJHJ-e-kyX