Как я могу создать карту со значением nil в одном поле и затем направить ее в json? - PullRequest
0 голосов
/ 24 мая 2019

Мне нужно получить строку 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)
...

Ответы [ 3 ]

3 голосов
/ 24 мая 2019

Для этого конкретного случая вы можете использовать:

jsonbody := map[string]error{"Error": nil}

Но для более обобщенного вы можете также использовать:

jsonbody := map[string]interface{}{"Error": nil}

Оба подхода приведут к:

{"Error":null}
1 голос
/ 24 мая 2019

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

Посмотри на детской площадке .

1 голос
/ 24 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...