Мне нужно получить строку json
{"Error": null }
Я могу сделать это, используя этот подход
type OKResponse struct {
Error *int `json:"Error"`
}
encoded, err := json.Marshal(OKResponse{})
...
Как я могу получить тот же результат, используя карту? Или это невозможно?
Например что-то вроде этого
jsonbody := map[string]int{"Error": nil}
encoded, err := json.Marshal(&jsonbody)
...

Поскольку число не может получить значение nil, вы не можете этого сделать.
Что вы можете сделать, так это использовать тип указателя, а затем это можно сделать, например:
package main
import (
"fmt"
"encoding/json"
)
func main() {
jsonbody := map[string]*int{"Error": nil}
encoded, _ := json.Marshal(&jsonbody)
fmt.Printf("%s", encoded)
num := 6
jsonbody = map[string]*int{"Error": &num}
encoded, _ = json.Marshal(&jsonbody)
fmt.Printf("%s", encoded)
}
https://play.golang.org/p/TTpgr7Cy17C
У вас может быть пустой интерфейс в качестве значения для карты, что-то вроде: map[string]interface{}{"Error": 5, "Success": nil}, но это будет означать, что любое значение может быть присвоено карте в качестве значения.
Если вы измените тип на *int, он будет делать то, что вы хотите:
type OKResponse struct {
Error *int `json:"Error"`
}
Пример:
r1 := OKResponse{}
result1, _ := json.Marshal(r1)
fmt.Printf("result1 = %s\n", string(result1))
errNo := 1
r2 := OKResponse{Error: &errNo}
result2, _ := json.Marshal(r2)
fmt.Printf("result2 = %s\n", string(result2))
Выход:
result1 = {"Error":null}
result2 = {"Error":1}
Смотрите на игровой площадке.
Для этого конкретного случая вы можете использовать:
jsonbody := map[string]error{"Error": nil}
Но для более общего вы также можете использовать:
jsonbody := map[string]interface{}{"Error": nil}
Оба подхода будут производить:
{"Error":null}
Что, если карта будет использовать другой тип для файла?