В данной инструкции показан очень специфичный случай, когда программа принимает JSON из ненадежного источника, и JSON содержит массив объектов, у которых есть начальный токен [
. Однако количество элементов в массиве велико, поэтому целостность JSON данных может быть повреждена.
Поврежденный JSON — как извлечь из него данные в Go?
1. Создайте файл json.go
со следующим содержимым:
![](https://golangify.com/wp-content/uploads/2020/04/go-read.png)
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package main import ( "encoding/json" "fmt" "strings" ) const js = ` [{ "name":"Axel", "lastname":"Fooley" }, { "name":"Tim", "lastname":"Burton" }, { "name":"Tim", "lastname":"Burton" ` type User struct { Name string `json:"name"` LastName string `json:"lastname"` } func main() { userSlice := make([]User, 0) r := strings.NewReader(js) dec := json.NewDecoder(r) for { tok, err := dec.Token() if err != nil { break } if tok == nil { break } switch tp := tok.(type) { case json.Delim: str := tp.String() if str == "[" || str == "{" { for dec.More() { u := User{} err := dec.Decode(&u) if err == nil { userSlice = append(userSlice, u) } else { break } } } } } fmt.Println(userSlice) } |
2. Запустите код через go run json.go
;
3. Посмотрите на результат в терминале:
1 |
[{Axel Fooley} {Tim Burton}] |
Помимо функции Unmarshall, пакет json также содержит API декодера. С помощью NewDecoder
можно создать декодер. Через вызов метода Token от декодера, базовый Reader прочитывается и возвращается интерфейс токена. Он может содержать несколько значений.
Одно из значений является тип Delim
, это руна, содержащая один из символов {, [, ], }
. Основываясь на этом, фиксируется начало JSON массива. С помощью метода More
для декодера можно зафиксировать больше объектов для декодирования.
![](https://golangify.com/wp-content/uploads/2021/01/v.jpg)
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»