如何在Go中设置自定义json响应结构

I am importing "encoding/json" package to print output in json.I was able to get the json format but i want to modify the response structure. Here is the sample code

var people []Person
people = append(people, Person{Id: "1", Firstname: "John", Lastname: "Doe", Address: Address{City: "City X", State: "State X"}})
people = append(people, Person{Id: "2", Firstname: "Koko", Lastname: "Doe", Address: Address{City: "City Z", State: "State Y"}})
people = append(people, Person{Id: "3", Firstname: "Francis", Lastname: "Sunday"})
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(people)

which outputs the following response

[
{
    "id": "1",
    "firstname": "John",
    "lastname": "Doe",
    "address": {
        "city": "City X",
        "state": "State X"
    }
},
{
    "id": "2",
    "firstname": "Koko",
    "lastname": "Doe",
    "address": {
        "city": "City Z",
        "state": "State Y"
    }
},
{
    "id": "3",
    "firstname": "Francis",
    "lastname": "Sunday",
    "address": {
        "city": "",
        "state": ""
    }
}
]

But i want to response into the following format

{
"status": "200",
"data": [
    {
        "id": "1",
        "firstname": "John",
        "lastname": "Doe",
        "address": {
            "city": "City X",
            "state": "State X"
        }
    },
    {
        "id": "2",
        "firstname": "Koko",
        "lastname": "Doe",
        "address": {
            "city": "City Z",
            "state": "State Y"
        }
    },
    {
        "id": "3",
        "firstname": "Francis",
        "lastname": "Sunday",
        "address": {
            "city": "",
            "state": ""
        }
    }
        ]
}

How can I modify the response format ? I am beginner in Go. Thanks for your help.

In order to change structure of your response, you need to provide the structure that you want to achieve with type.

You can define Response struct type which will consist of data and status fields:

type Response struct {
    Status string `json:"status"`
    Data []Person `json:"data"`
}

var people []Person
people = append(people, Person{Id: "1", Firstname: "John", Lastname: "Doe", Address: Address{City: "City X", State: "State X"}})
people = append(people, Person{Id: "2", Firstname: "Koko", Lastname: "Doe", Address: Address{City: "City Z", State: "State Y"}})
people = append(people, Person{Id: "3", Firstname: "Francis", Lastname: "Sunday"})
w.Header().Set("Content-Type", "application/json")

resp := Response{Status: "200", Data: people}
json.NewEncoder(w).Encode(resp)

you just need to pass response and request object to the function you are using w.Header().Set("Content-Type", "application/json"). Either you can append to the struct or you can initialize it with multiple values in an array.

package main

import "encoding/json"

//  Data struct
type Data struct {
    status string
    data   []Person
}

// Person struct
type Person struct {
    Id        string
    Firstname string
    Lastname  string
    Address   Address
}

// Address struct
type Address struct {
    City  string
    State string
}

func main() {
    people := Data{
        status: "200",
        data: []Person{
            {Id: "1", Firstname: "John", Lastname: "Doe", Address: Address{City: "City X", State: "State X"}},
            {Id: "2", Firstname: "Koko", Lastname: "Doe", Address: Address{City: "City Z", State: "State Y"}},
            {Id: "3", Firstname: "Francis", Lastname: "Sunday", Address: Address{City: "City Z", State: "State Y"}},
        },
    }
    json.NewEncoder(w).Encode(people)
}