Unmarshal возвращает пустой объект из-за кодировки - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь разархивировать необработанную строку json. Кажется, есть ошибка с кодировкой, но я не могу понять это.

основной пакет

import (
    "encoding/json"
    "fmt"
    "log"
)

type Foo struct {
    Transmission string `json:"transmission"`
    Trim         string `json:"trim"`
    Uuid         string `json:"uuid"`
    Vin          string `json:"vin"`
}

func main() {

    var foo Foo

    sample := `{
        "transmission": "continuously\x20variable\x20automatic",
        "trim": "SL",
        "uuid" : "6993e4090a0e0ae80c59a76326e360a1",
        "vin": "5N1AZ2MH6JN192059"
    }`

    err := json.Unmarshal([]byte(sample), &foo)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(foo)

}

2009/11/10 23:00:00 недопустимый символ 'x' в escape-коде строки

Работает, если запись передачи удалена.

Вот рабочая площадка .

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете заменить \x на \\x, используя функцию string.Replace(). Затем отмените замену строки. Вот рабочий пример.

0 голосов
/ 29 октября 2018

Ваш ввод не является допустимым JSON. В спецификации JSON указано, что

Все кодовые точки могут быть помещены в кавычки, кроме кодовых точек, которые должны быть экранированы: кавычка (U + 0022), обратный солидус (U + 005C) и контрольные символы от U + 0000 до U + 001F .

Кроме того, хотя существуют двухсимвольные escape-последовательности, \x не является одной из них, и, следовательно, он правильно интерпретируется как недопустимая escape-последовательность синтаксическим анализатором Go. Если вы хотите иметь литерал с обратной косой чертой в вашем JSON, он должен быть представлен \\ в самом вводе JSON. Смотрите измененную версию вашего примера: https://play.golang.org/p/JZdPJGpPR5q

(обратите внимание, что это не проблема с строковым литералом Go, поскольку вы уже используете необработанный (``) строковый литерал - сам JSON должен иметь две обратные косые черты.)

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