Go json. Маршал не может получить одну обратную косую черту - PullRequest
0 голосов
/ 29 апреля 2020
var (
    username        string = "ADuser\\user"
    password         string = "PASS"
    userCredentials        = map[string]string{"username": username, "password": password}
)

func main() {
   jsonValue, _ := json.Marshal(userCredentials)
   ...
}

Если я пытаюсь распечатать маршальное значение, я получаю этот вывод

fmt.Println(string(jsonValue))
   Output:
      {"password":"PASS","username":"ADuser\\user"}

Но если я пытаюсь напечатать только имя пользователя, я получаю этот вывод

fmt.Println(username)
    Output:
      ADuser\user

Мне нужен этот вывод:

fmt.Println(string(jsonValue))
   Output:
      {"password":"PASS","username":"ADuser\user"}

Я пытался использовать код ASCII, но я получаю тот же вывод. Есть какие-нибудь идеи, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 29 апреля 2020

Все как и должно быть. Backsla sh является специальным символом в JSON, и если строка должна содержать backsla sh, в представлении JSON ее необходимо экранировать, то есть удвоить.

Ваше имя пользователя в тексте JSON содержит значение ADuser\user, но в JSON оно должно быть представлено двойным обратным символом sh.

Вы увидите его, если расшифруете:

var decoded map[string]string
if err := json.Unmarshal(jsonValue, &decoded); err != nil {
    panic(err)
}

fmt.Println(decoded)

Будет выведено (попробуйте на Go Playground ):

map[password:PASS username:ADuser\user]
...