Получил ошибку "недопустимый символ 'ï', ищущий начало значения " от json.Неупорядочьте

я использую 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)

I найденные исходные данные могут иметь проблемы, поэтому я пытаюсь сравнить два данных в .

данные 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 и Unmarshal его в структуру данных?

1 ответов


сервер отправляет вам текстовую строку UTF-8 с Знак порядка байтов (BOM). Спецификация определяет, что текст кодируется UTF-8, но его следует удалить перед декодированием.

Это можно сделать со следующей строкой (используя "байт"):

body = bytes.TrimPrefix(body, []byte("\xef\xbb\xbf")) // Or []byte{239, 187, 191}

PS. Ошибка, относящаяся к ï потому что спецификация UTF-8, интерпретируемая как строка ISO-8859-1, создаст символы .