Me cuesta agregar una etiqueta externa a mi estructura JSON ordenada. Aquí está mi ejemplo:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "time"
)

type tObj struct {
    ModTime time.Time `json:"mTime"`
    Name    string    `json:"mName"`
}

func main() {
    var objs []tObj
    objs = append(objs, getItem("first"))
    objs = append(objs, getItem("second"))

    json, err := json.MarshalIndent(objs, "", "    ")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(json))
}

func getItem(name string) tObj {
    var t tObj
    t.ModTime = time.Now()
    t.Name = name
    return t
}

Hasta ahora todo bien, esto me da algo como esto:

[{
        "mTime": "2020-06-26T21:29:52.148663+02:00",
        "mName": "first"
    },
    {
        "mTime": "2020-06-26T21:29:52.148666+02:00",
        "mName": "second"
    }
]

Todo lo que quiero es agregar una etiqueta externa al JSON resultante, así:

{
    "objects": [{
            "mTime": "2020-06-26T21:29:52.148663+02:00",
            "mName": "first"
        },
        {
            "mTime": "2020-06-26T21:29:52.148666+02:00",
            "mName": "second"
        }
    ]
}

Intenté agregar una anotación json directamente al tipo de estructura, pero eso no funcionó. ¿Cuál es la forma más fácil de lograr esto?

-1
tjr 26 jun. 2020 a las 22:43

2 respuestas

Otra solución es simplemente envolver su matriz tObj en una estructura y agregar la etiqueta adecuada a su campo:

type tObjWrapper struct {
    TObjs []tObj `json:"objects"`
}

type tObj struct {
    ModTime time.Time `json:"mTime"`
    Name    string    `json:"mName"`
}

Y luego lo clasificas como:

    wrapper := &tObjWrapper{
        TObjs: []tObj{
            getItem("first"),
            getItem("second"),
        },
    }

    json, err := json.MarshalIndent(wrapper, "", "    ")

Puede verlo en Ir a la zona de juegos

0
blackgreen 26 jun. 2020 a las 20:27

Ya no está ordenando una matriz, está ordenando un objeto. Puede lograr esto al:

json, err := json.MarshalIndent(map[string]interface{}{"objects":objs}, "", "    ")
0
Burak Serdar 26 jun. 2020 a las 19:45