Xử lý JSON với Go

Những kiến thức cơ bản về JSON sắp xếp và bỏ quản lý

JSON là viết tắt củaJavaScriptKý hiệu đối tượng và đó là một cách rất tiện dụng để trao đổi dữ liệu có cấu trúc. Và nó rất phổ biến, đặc biệt là khi tương tác với các API.

Go có hỗ trợ cấp cao nhất cho JSON trong thư viện tiêu chuẩn của nó, vớicácencoding/jsongói hàng.

So với các ngôn ngữ được gõ lỏng lẻo, giải mã JSON phức tạp hơn. Trong JavaScript, tất cả những gì bạn cần làm làJSON.parse(). Python cójson.loads()và PHP cójson_decode(). Chúng chỉ kết xuất các giá trị mà không có vấn đề gì, nhưng khi được gõ mạnh, bạn cần phải làm thêm một chút để khớp các loại.

JSON có 3 loại cơ bản:booleans,con số,dây, kết hợp sử dụngmảngcác đối tượngđể xây dựng các cấu trúc phức tạp.

Các cuộc gọi thuật ngữ của Gosoái caquá trình tạo chuỗi JSON từ cấu trúc dữ liệu vàkhông gây chết ngườihành động phân tích cú pháp JSON thành một cấu trúc dữ liệu.

Một chuỗi JSON

input := `{"firstname": "Bill", "surname": "Gates"}`

JSON không gây chết người

Đây là một ví dụ JSON được lấy từMDN của Mozilla

{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name": "Eternal Flame",
      "age": 1000000,
      "secretIdentity": "Unknown",
      "powers": [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
}

Làm thế nào chúng ta có thể phân tích cú pháp nó thành một cấu trúc dữ liệu Go? Tất nhiên, chúng ta cần một cấu trúc dữ liệu phù hợp. Chúng ta có 5 kiểu cơ bản và một mảng các đối tượng. Hãy bắt đầu với các loại cơ bản:

type squad struct {
    SquadName string
    HomeTown string
    Formed int
    SecretBase string
    Active bool
}

Chúng ta cần xác định JSON là một[]byte, như thế này:

input := []byte(`
    {
        "squadName": "Super hero squad",
        [...]
    }
`)

Và chúng ta có thể tháo gỡ JSON thành một phiên bản nhóm:

s := squad{}
err := json.Unmarshal(input, &s)
if err != nil {
    panic(err)
}
fmt.Printf("%v", s)

Điều này sẽ in

{Super hero squad Metro City 2016 Super tower true}

chơi

Lưu ý rằng chúng tôi không gặp bất kỳ lỗi nào khi phàn nàn về sự thiếu khớp giữa các giá trị JSON và cấu trúc của chúng tôi, chúng bị bỏ qua.

Hãy đảm bảo rằng json.Unmarshal () sẽ lấy cho chúng ta tất cả các trường, với:

type squad struct {
	SquadName  string
	HomeTown   string
	Formed     int
	SecretBase string
	Active     bool
	Members    []Member
}

type Member struct { Name string Age int SecretIdentity string Powers []string }

chơi

Hãy nhớ có thuộc tính công khai (chữ hoa) trong cấu trúc của bạn.

Đổi tên tên trường JSON

Trong trường hợp này, tất cả đều ổn vì JSON có tên tệp tương thích. Điều gì sẽ xảy ra nếu bạn muốn ánh xạ JSON đến các trường khác trong cấu trúc của mình?

Ví dụ: điều gì sẽ xảy ra nếu tên Thành viên được chuyển thànhmember_name, nhưng bạn muốn nó được lưu trữ trongNamethay thế?

Sử dụng cú pháp này:

type Member struct {
	Name string `json:"member_name"`
}

Bỏ qua các trường JSON

Sử dụng cú pháp này:

type Member struct {
	Name string `json:"-"`
}

và trường Tên sẽ bị bỏ qua khi sắp xếp / bỏ quản lý.

Chuyển đổi các loại trường JSON

Bạn có thể sử dụng các thẻ để chú thích loại JSON sẽ được chuyển đổi thành:

type Member struct {
    Age       int `json:"age,string"`
}

Cấu trúc thành viên có mộtAgetài sản được đại diện như mộtint. Điều gì xảy ra nếu bạn muốn nó trở thành mộtstringthay vào đó, nhưng JSON vượt qua mộtint?

Sử dụng chú thích loại:

type Member struct {
    Age       json.Number `json:"age,Number"`
}

Loại Số là bí danh chostring.

Tìm hiểu thêm về các thẻ trongGiải thích về Thẻ Go

Marshal JSON

Bây giờ chúng ta có thể muốn xây dựng một chuỗi JSON từ các cấu trúc dữ liệu của mình. Ví dụ: đây có thể là chương trình lấy mã quốc gia và trả về chi tiết quốc gia tương ứng ở định dạng JSON.

package main

import ( “encoding/json” “fmt” )

type country struct { Name string }

func main() { country_code := “US”

<span style="color:#a6e22e">the_country</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">country</span>{}

<span style="color:#66d9ef">switch</span> <span style="color:#a6e22e">country_code</span> {
<span style="color:#66d9ef">case</span> <span style="color:#e6db74">"US"</span>:
	<span style="color:#a6e22e">the_country</span>.<span style="color:#a6e22e">Name</span> = <span style="color:#e6db74">"United States"</span>
}

<span style="color:#a6e22e">c</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">Marshal</span>(<span style="color:#a6e22e">the_country</span>)
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
	panic(<span style="color:#a6e22e">err</span>)
}

<span style="color:#75715e">// c is now a []byte containing the encoded JSON

fmt.Print(string(c)) }

chơi

Khi được thực thi, chương trình này sẽ in{"Name":"United States"}.

json.Marshal()trả về một[]byte, vì vậy chúng ta phải truyền nó thành chuỗi khi chuyển nó tớifmt.Print(), nếu không, bạn sẽ thấy một danh sách các số dường như vô nghĩa (nhưng chúng có ý nghĩa, vì chúng là các byte thực tế tạo nên chuỗi).

json.Marshal()sẽ xử lý chính xác các loại cơ bản và tổng hợp như lát cắt và bản đồ.

Đọc thêm

Đọc thêmtrên blog Govà trongcácencoding/jsontài liệu gói


Các hướng dẫn về go khác: