Xử lý JSON với Golang

1229
xử lý json với golang

Khi xử lý JSON dùng các ngôn ngữ dạng statically type thường có chút củ chuối. Nguyên nhân do dữ liệu JSON vô cùng phức tạp, có thể là number, string, hoăc một mớ hỗ tạp array và object lồng vào nhau (ít còn đỡ, nhiều nó lồng vào nhau thì thốn vc). Dùng ngôn ngữ Go thì bạn lại phải làm cho cấu trúc JSON khớp với struct của biến (chứ không như các loại ngôn ngữ dạng dynamic type khác decode gán vào biến là xong).

Sời, quá may Go đã có gắng làm cho quá trình này trở nên dễ dàng với chúng ta nhất có thể và cung cấp cho chúng ta rất nhiều tuỳ chọn để chúng ta parse dữ liệu JSON của mình.

Tóm tắt

Package encoding/json trong thư viện chuẩn của Go cung cấp cho chúng ta tất cả các function mà chúng ta cần ròi. Với bất kỳ chuỗi JSON nào, cách chuẩn để parse sẽ như sau:

Điều chúng ta sẽ thảo luận trong bài viết này là các tuỳ chọn dùng để parse dữ liệu và khi nào thì dùng chúng.

Có hai loại dữ liệu bạn sẽ gặp khi làm việc với JSON:

  1. Structured data (dữ liệu có cấu trúc)
  2. Unstructured data (dữ liệu không có cấu trúc)

Structured data

Cái này dễ nhất rồi, mà thầy dạy rồi cái nào dễ làm trước. Đây là loại dữ liệu mà bạn biết trước cấu trúc. Ví dụ: Giả sử bạn có một đối tượng chim, trong đó mỗi con chim có một trường species và trường decription:

Để xử lý thàng này thì cần tạo một struct y như đoạn JSON kia. Trong trường hợp này, chúng ta sẽ tạo struct Bird với thuộc tính Species và Description:

Và parse như sau:

Chạy thử

Theo quy ước, Go sử dụng tên của thuộc tính để biểu diễn thuộc tính của JSON cùng tên. Do đó thuộc tính Species trong struct Bird sẽ được ánh xạ tới species, Species hoặc sPeCiEs của chuỗi JSON.

JSON Arrays

Thế giờ có cả tập đoàn chim thì làm như nào?

Vì mỗi phần tử của mảng thực tế là một con chim, nên bạn hoàn toàn có thể parse nó, chỉ cần tạo tạo một mảng chim:

Chạy thử

Embedded objects

Thế giờ trong trường hợp bạn có một thuộc tính Dimensions chứa độ cao và độ dài của chim thì sao?

  Golang là gì? 9 Framework tối ưu “cực căng” cho Golang

Giống như ví dụ trước, chúng ta cần tạo một struct ý như cấu trúc của chuỗi JSON. Tạo thêm struct Simensions và nhúng vào.

Rồi, giờ struct Bird sẽ như sau:

Lần này cũng parse y như cũ thoi:

Chạy thử

Có thể bạn muốn xem:

  Golang là gì? 9 Framework tối ưu “cực căng” cho Golang
  JSON Web Token (JWT) là gì ?

Custom attribute names

Như mình đã nhắc đến ở trên Go dùng quy ước để ánh xạ dữ liệu từ chuỗi JSON với struct. Nhưng trong nhiều trường hợp cần đặt lại tên thuộc tính ở struct khác với chuỗi JSON thì làm như nào?

Như chuỗi JSON này, mình thích dùng birdType cho Species hơn. Và méo thể tạo được thuộc tính của struct để parse cái thể loại này “what it does”. Sời, chúng ta tạo struct như sau:

Giờ cứ thế parse như bình thường thôi Go sẽ tự ánh xạ.

Chạy thử

Unstructured data

Nếu bạn có chuỗi JSON mà api trả về không có cấu trúc xác định hoặc tên thuộc tính mà bạn không chắc chắn, bạn không thể sử dụng struct để parse liệu của mình, vì có biết dữ liệu nó biến đổi khôn lường. Thay vào đó bạn có thể sử dụng map. Xem ví dụ sau (vẫn là chim):

Không thể tạo một struct để biểu diễn dữ liệu như bên trên có tất cả các trường hợp chim biến đổi, lúc dài lúc ngắn, lúc thêm trường này lúc thêm trường kia.

Để đối phó với loại này ta tạo một map với key là string và value để ở kiểu interface:

Chạy thử

Mỗi string tương ứng với thuộc tính của JSON, và nó được ánh xa đến kiểu interface{}tương ứng với giá trị, nó có thể là bất cứ kiểu dữ kiệu nào. Bây giờ lại chuyển qua bào toán duyệt map và dùng interface (nếu chưa biết các dùng interface thì các bạn có thể tra google)

Chốt, thế giờ dùng cái nào

Khi nào dữ liệu có cấu trúc rõ dàng, không thay đổi thì dùng struct, cái nào mà biến đổi khôn lường thì dùng map thế thôi. Hết!

Nguồn: https://www.sohamkamani.com/blog/2017/10/18/parsing-json-in-golang/

Topdev via viblo

  Tại sao phải sử dụng JSON Web Token (JWT) để bảo mật API
  Xử lý JSON với Golang
Phần 7 : Xử lý file JSON”]