Как я могу создать карту с нулевым значением в одном поле, а затем маршалировать ее в json?

Мне нужно получить строку 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)
...
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
0
153
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку число не может получить значение 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

Что, если карта будет использовать другой тип для файла?

Raf 24.05.2019 09:45

У вас может быть пустой интерфейс в качестве значения для карты, что-то вроде: map[string]interface{}{"Error": 5, "Success": nil}, но это будет означать, что любое значение может быть присвоено карте в качестве значения.

Avihoo Mamka 24.05.2019 09:47

Если вы измените тип на *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}

Другие вопросы по теме