Вопрос:
Я использую HTTP-запрос Golang для получения json-вывода следующим образом.
Веб-сервис, к которому я пытаюсь обратиться, – это Micrsoft Translator https://msdn.microsoft.com/en-us/library/dn876735.aspx
//Data struct of TransformTextResponse type TransformTextResponse struct { ErrorCondition int `json:»ec»` // A positive number representing an error condition ErrorDescriptive string `json:»em»` // A descriptive error message Sentence string `json:»sentence»` // transformed text } //some code …. body, err := ioutil.ReadAll(response.Body) defer response.Body.Close() if err != nil { return «», tracerr.Wrap(err) } transTransform = TransformTextResponse{} err = json.Unmarshal(body, &transTransform) if err != nil { return «», tracerr.Wrap(err) }
Я получил сообщение об ошибке invalid character ‘ï’ looking for beginning of value
Итак, я пытаюсь напечатать строку body как строку fmt.Println(string(body)), она показывает:
{«ec»:0,»em»:»OK»,»sentence»:»This is too strange i just want to go home soon»}
Кажется, что у данных нет никаких проблем, поэтому я попытался создать одно и то же значение jason.Marshal
transTransform := TransformTextResponse{} transTransform.ErrorCondition = 0 transTransform.ErrorDescriptive = «OK» transTransform.Sentence = «This is too strange i just want to go home soon» jbody, _ := json.Marshal(transTransform)
Я обнаружил, что исходные данные могут иметь проблемы, поэтому я пытаюсь сравнить два данных в формате []byte.
Данные из response.Body:
[239 187 191 123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125]
Данные из json.Marshal
[123 34 101 99 34 58 48 44 34 101 109 34 58 34 79 75 34 44 34 115 101 110 116 101 110 99 101 34 58 34 84 104 105 115 32 105 115 32 116 111 111 32 115 116 114 97 110 103 101 32 105 32 106 117 115 116 32 119 97 110 116 32 116 111 32 103 111 32 104 111 109 101 32 115 111 111 110 34 125]
Любая идея, как я анализирую этот response.Body и развязал его в структуру данных?
Лучший ответ:
Сервер отправляет вам текстовую строку UTF-8 с отметкой байтового байта (BOM). Спецификация указывает, что текст кодируется в кодировке UTF-8, но он должен быть удален перед декодированием.
Это можно сделать со следующей строкой (используя package “bytes” ):
body = bytes.TrimPrefix(body, []byte(«xefxbbxbf»)) // Or []byte{239, 187, 191}
PS. Ошибка, относящаяся к ï, заключается в том, что спецификация UTF-8, интерпретированная как строка ISO-8859-1, приведет к символам .