В чем разница между кодировкой/декодированием JSON и сортировкой/разборкой JSON?
Пытаясь научиться писать RESTFUL api в golang и не уверен, какая разница между кодировкой JSON и маршаллингом, или если они одинаковы?
В чем разница между кодировкой/декодированием JSON и сортировкой/разборкой JSON?
Пытаясь научиться писать RESTFUL api в golang и не уверен, какая разница между кодировкой JSON и маршаллингом, или если они одинаковы?
Маршал и Unmarshal конвертируют JSON в строку и наоборот. Кодирование и декодирование преобразуют JSON в поток и наоборот.
Нижеприведенный код показывает работу маршала и немаршала
type Person struct {
First string
Last string
}
func main() {
/* This will marshal the JSON into []bytes */
p1 := Person{"alice", "bob"}
bs, _ := json.Marshal(p1)
fmt.Println(string(bs))
/* This will unmarshal the JSON from []bytes */
var p2 Person
bs = []byte(`{"First":"alice","Last":"bob"}`)
json.Unmarshal(bs, &p2)
fmt.Println(p2)
}
Кодер и декодер записывают структуру в срез потока или считывают данные из среза потока и преобразуют его в структуру. Внутри он также реализует метод маршала. Единственное отличие состоит в том, что если вы хотите играть с строкой или байтами, используйте маршал, и если какие-либо данные вы хотите прочитать или записать в какой-либо интерфейс записи, используйте кодировки и декодируйте.
Как правило, кодирование/декодирование JSON
относится к процессу фактического чтения/записи символьных данных в строку или двоичную форму. Marshaling/Unmarshaling относится к процессу отображения типов JSON
из типов данных и примитивов Go
и Go
.
Фактическое кодирование может включать в себя такие вещи, как сериализация символов юникода, например. Я думаю, что они могут использоваться несколько взаимозаменяемо в документации иногда, потому что они обычно происходят на одном и том же этапе. Например, функция Marshal определит, какой тип JSON должен маршировать что-то, а затем он будет закодирован в строковой форме (который может включать в себя другие данные, такие как специальные символы, если его текстовые данные).
Вы можете проконсультироваться с документами go json package для получения более подробной информации о том, как работают маршалинг/unmarshaling.
func Encode - это метод Encoder, который записывает типы Go, кодированные JSON, в выходной поток (func NewEncoder берет io.Writer и возвращает * Encoder).
Типы Go входят в черный ящик и записываются в поток в форматировании JSON.
Маршал - это функция, которая возвращает JSON-кодирование типов Go.
Здесь типы Go входят в черный ящик и выходят из коробки в форматировании JSON.
Хорошо документировано: golang.org/pkg/encoding/json/
Я не могу согласиться с @vinit, маршал кодирует t интерфейса типа {} в Json, и t может фактически иметь строку, struct, integer, pointer.
NewCoder (r io.Reader) и Encode (v interface {}), с другой стороны, кодирует v интерфейса типа {} в поток r.
NOT JUST String.