Basharat Ali
Basharat Ali

Reputation: 1209

Wrap API Json response in Go

I am sorry if this is a silly question because i am very new in Go. I am calling couple of apis on the base of business logic, different types of response coming like json array, nest json and single json object. i need to wrap a api response that called according to business logic in a common format like:

{
"data":"api response here",
"statusCode":200
}

i tried some but its not expect output

type Model[T any] struct {
    Data       T
    StatusCode int
}

model := Model[string]{Data: apiResponse, StatusCode: 200}
out, err := json.Marshal(model)

out put of this code is

{
    "Data": "[{\"name\":\"Harry Potter\",\"city\":\"London\"},{\"name\":\"Don Quixote\",\"city\":\"Madrid\"},{\"name\":\"Joan of Arc\",\"city\":\"Paris\"},{\"name\":\"Rosa Park\",\"city\":\"Alabama\"}]",
    "StatusCode": 200
}

this i made these changes

var result []map[string]interface{} 
json.Unmarshal([]byte(body), &result) 
out, err := json.Marshal(result)

output was as expected, above api response was in proper json when use []map[string]interface
problem is, its only for those api that return array of json. those apis returning single json object then to make it work i need to do this

map[string]interface`

means remove the array map. i need to make it generic so that any kind of json response map into it.

Upvotes: 0

Views: 1408

Answers (2)

nipuna
nipuna

Reputation: 4095

Use type of field Data as an interface{}

type APIResponse struct {
    Data       interface{} `json:"data"`
    StatusCode int         `json:"statusCode"`
}

And then you can assign any API Response type to the Data field and marshal it.

func main() {
    r := []Person{
        {
            Name: "Harry Porter",
            City: "London",
        },
        {
            Name: "Don Quixote",
            City: "Madrid",
        },
    }

    res := APIResponse{
        Data:       r,
        StatusCode: 200,
    }

    resByt, err := json.Marshal(res)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(resByt))
}

Output

{"data":[{"name":"Harry Porter","city":"London"},{"name":"Don Quixote","city":"Madrid"}],"statusCode":200}

Run the full code here in Playground.

Upvotes: 1

Burak Serdar
Burak Serdar

Reputation: 51577

You can simply do:

result:=map[string]interface{} {
   "data": apiResponse,
   "statusCode": 200,
}
out, err:=json.Marshal(result)

Upvotes: 0

Related Questions