paint-brush
Ny endri-javatra vaovao ao amin'ny Go dia manamora kokoa ny fanodinana, manodina ny angona JSONny@olvrng
Tantara vaovao

Ny endri-javatra vaovao ao amin'ny Go dia manamora kokoa ny fanodinana, manodina ny angona JSON

ny Oliver Nguyen13m2024/12/17
Read on Terminal Reader

Lava loatra; Mamaky

Ahoana raha azonao atao ny mamakivaky ny angon-drakitrao JSON, alaivo ny lalan'ny singa tsirairay, ary manapa-kevitra tsara izay tokony hatao amin'izany amin'ny lalitra?
featured image - Ny endri-javatra vaovao ao amin'ny Go dia manamora kokoa ny fanodinana, manodina ny angona JSON
Oliver Nguyen HackerNoon profile picture

Efa nila nanova ny angona JSON tsy voarafitra ao amin'ny Go ve ianao? Angamba tsy maintsy nofafanao ny tenimiafina sy ny saha rehetra voatanisa ao anaty lisitra mainty, nanova anarana ny lakile avy amin'ny camelCase ho snake_case , na mamadika ny laharana rehetra ho tady satria tsy tia int64 ny JavaScript ? Raha ny vahaolanao dia ny famadihana ny zava-drehetra ho ao anaty map[string]any amin'ny fampiasana encoding/json ary avy eo avereno indray... eny ary, andao hiatrika izany fa tsy mahomby izany!


Ahoana raha azonao atao ny mamakivaky ny angon-drakitra JSON, alaivo ny lalan'ny singa tsirairay, ary manapa-kevitra tsara izay tokony hatao amin'ny lalitra?


Eny! Manana vaovao tsara aho! Miaraka amin'ny endri-javatra iterator vaovao ao amin'ny Go 1.23, misy fomba tsara kokoa hamerenana sy hanodinana an'i JSON. Hihaona amin'ny ezpkg.io/iter.json — namanao matanjaka sy mahomby amin'ny fiaraha-miasa amin'i JSON ao amin'ny Go.


1. Mamerina ny JSON

Raha jerena fa manana rakitra alice.json izahay:

 { "name": "Alice", "age": 24, "scores": [9, 10, 8], "address": { "city": "The Sun", "zip": 10101 } }


Voalohany, andao hampiasa for range Parse() hamaritana ny rakitra JSON, avy eo manonta ny lalana, ny lakile, ny marika ary ny haavon'ny singa tsirairay. Jereo ohatra/01.iter .

 package main import ( "fmt" "ezpkg.io/errorz" iterjson "ezpkg.io/iter.json" ) func main() { data := `{"name": "Alice", "age": 24, "scores": [9, 10, 8], "address": {"city": "The Sun", "zip": 10101}}` // 🎄Example: iterate over json fmt.Printf("| %12v | %10v | %10v |%v|\n", "PATH", "KEY", "TOKEN", "LVL") fmt.Println("| ------------ | ---------- | ---------- | - |") for item, err := range iterjson.Parse([]byte(data)) { errorz.MustZ(err) fmt.Printf("| %12v | %10v | %10v | %v |\n", item.GetPathString(), item.Key, item.Token, item.Level) } }


Ny code dia mivoaka:

 | PATH | KEY | TOKEN |LVL| | ------------ | ---------- | ---------- | - | | | | { | 0 | | name | "name" | "Alice" | 1 | | age | "age" | 24 | 1 | | scores | "scores" | [ | 1 | | scores.0 | | 9 | 2 | | scores.1 | | 10 | 2 | | scores.2 | | 8 | 2 | | scores | | ] | 1 | | address | "address" | { | 1 | | address.city | "city" | "The Sun" | 2 | | address.zip | "zip" | 10101 | 2 | | address | | } | 1 | | | | } | 0 |

2. Manorina JSON

Ampiasao Builder hananganana angona JSON. Manaiky tohan-kevitra azo atao amin'ny indentation. Jereo ohatra/02.builder .

 b := iterjson.NewBuilder("", " ") // open an object b.Add("", iterjson.TokenObjectOpen) // add a few fields b.Add("name", "Alice") b.Add("age", 22) b.Add("email", "[email protected]") b.Add("phone", "(+84) 123-456-789") // open an array b.Add("languages", iterjson.TokenArrayOpen) b.Add("", "English") b.Add("", "Vietnamese") b.Add("", iterjson.TokenArrayClose) // close the array // accept any type that can marshal to json b.Add("address", Address{ HouseNumber: 42, Street: "Ly Thuong Kiet", City: "Ha Noi", Country: "Vietnam", }) // accept []byte as raw json b.Add("pets", []byte(`[{"type":"cat","name":"Kitty","age":2},{"type":"dog","name":"Yummy","age":3}]`)) // close the object b.Add("", iterjson.TokenObjectClose) out := errorz.Must(b.Bytes()) fmt.Printf("\n--- build json ---\n%s\n", out)


Izay hamoaka ny JSON miaraka amin'ny indentation:

 { "name": "Alice", "age": 22, "email": "[email protected]", "phone": "(+84) 123-456-789", "languages": [ "English", "Vietnamese" ], "address": {"house_number":42,"street":"Ly Thuong Kiet","city":"Ha Noi","country":"Vietnam"}, "pets": [ { "type": "cat", "name": "Kitty", "age": 2 }, { "type": "dog", "name": "Yummy", "age": 3 } ] }

3. Fandrafetana JSON

Azonao atao ny manamboatra na manamboatra angona JSON amin'ny alàlan'ny fandefasana ny lakileny sy ny sandany amin'ny Builder . Jereo ohatra/03.reformat .

 { // 🐝Example: minify json b := iterjson.NewBuilder("", "") for item, err := range iterjson.Parse(data) { errorz.MustZ(err) b.AddRaw(item.Key, item.Token) } out := errorz.Must(b.Bytes()) fmt.Printf("\n--- minify ---\n%s\n----------\n", out) } { // 🦋Example: format json b := iterjson.NewBuilder("👉 ", "\t") for item, err := range iterjson.Parse(data) { errorz.MustZ(err) b.AddRaw(item.Key, item.Token) } out := errorz.Must(b.Bytes()) fmt.Printf("\n--- reformat ---\n%s\n----------\n", out) }


Ny ohatra voalohany dia manalefaka ny JSON raha ny ohatra faharoa kosa mamolavola azy amin'ny tovana "👉" isaky ny andalana.

 --- minify --- {"name":"Alice","age":24,"scores":[9,10,8],"address":{"city":"The Sun","zip":10101}} ---------- --- reformat --- 👉 { 👉 "name": "Alice", 👉 "age": 24, 👉 "scores": [ 👉 9, 👉 10, 👉 8 👉 ], 👉 "address": { 👉 "city": "The Sun", 👉 "zip": 10101 👉 } 👉 } ----------

4. Manampy laharan-tsipika

Amin'ity ohatra ity dia manampy laharan-tsipika amin'ny famoahana JSON izahay, amin'ny fampidirana b.WriteNewline() alohan'ny antso fmt.Fprintf() . Jereo ohatra/04.line_number .

 // 🐞Example: print with line number i := 0 b := iterjson.NewBuilder("", " ") for item, err := range iterjson.Parse(data) { i++ errorz.MustZ(err) b.WriteNewline(item.Token.Type()) // 👉 add line number fmt.Fprintf(b, "%3d ", i) b.Add(item.Key, item.Token) } out := errorz.Must(b.Bytes()) fmt.Printf("\n--- line number ---\n%s\n----------\n", out)


Izany dia hamoaka:

 1 { 2 "name": "Alice", 3 "age": 24, 4 "scores": [ 5 9, 6 10, 7 8 8 ], 9 "address": { 10 "city": "The Sun", 11 "zip": 10101 12 } 13 }

5. Manampy fanehoan-kevitra

Amin'ny fametrahana fmt.Fprintf(comment) eo anelanelan'ny b.WriteComma() sy b.WriteNewline() , dia azonao atao ny manampy fanehoan-kevitra amin'ny faran'ny andalana tsirairay. Jereo ohatra/05.comment .

 i, newlineIdx, maxIdx := 0, 0, 30 b := iterjson.NewBuilder("", " ") for item, err := range iterjson.Parse(data) { errorz.MustZ(err) b.WriteComma(item.Token.Type()) // 👉 add comment if i > 0 { length := b.Len() - newlineIdx fmt.Fprint(b, strings.Repeat(" ", maxIdx-length)) fmt.Fprintf(b, "// %2d", i) } i++ b.WriteNewline(item.Token.Type()) newlineIdx = b.Len() // save the newline index b.Add(item.Key, item.Token) } length := b.Len() - newlineIdx fmt.Fprint(b, strings.Repeat(" ", maxIdx-length)) fmt.Fprintf(b, "// %2d", i) out := errorz.Must(b.Bytes()) fmt.Printf("\n--- comment ---\n%s\n----------\n", out)


Izany dia hamoaka:

 { // 1 "name": "Alice", // 2 "age": 24, // 3 "scores": [ // 4 9, // 5 10, // 6 8 // 7 ], // 8 "address": { // 9 "city": "The Sun", // 10 "zip": 10101 // 11 } // 12 } // 13

6. Fanivanana JSON sy fanalana soatoavina

Misy item.GetPathString() sy item.GetRawPath() hahazoana ny lalan'ny entana ankehitriny. Azonao atao ny mampiasa azy ireo hanivana ny angona JSON. Jereo ohatra/06.filter_print .


Ohatra amin'ny item.GetPathString() sy regexp :

 fmt.Printf("\n--- filter: GetPathString() ---\n") i := 0 for item, err := range iterjson.Parse(data) { i++ errorz.MustZ(err) path := item.GetPathString() switch { case path == "name", strings.Contains(path, "address"): // continue default: continue } // 👉 print with line number fmt.Printf("%2d %20s . %s\n", i, item.Token, item.GetPath()) }


Ohatra amin'ny item.GetRawPath() sy path.Match() :

 fmt.Printf("\n--- filter: GetRawPath() ---\n") i := 0 for item, err := range iterjson.Parse(data) { i++ errorz.MustZ(err) path := item.GetRawPath() switch { case path.Match("name"), path.Contains("address"): // continue default: continue } // 👉 print with line number fmt.Printf("%2d %20s . %s\n", i, item.Token, item.GetPath()) }


Ireo ohatra roa ireo dia hamoaka:

 2 "Alice" . name 9 { . address 10 "The Sun" . address.city 11 10101 . address.zip 12 } . address

7. Sivana JSON ary mamerina JSON vaovao

Amin'ny fampifangaroana ny Builder amin'ny safidy SetSkipEmptyStructures(false) sy ny lojika sivana, azonao atao ny manivana ny angona JSON ary mamerina JSON vaovao. Jereo ohatra/07.filter_json

 // 🦁Example: filter and output json b := iterjson.NewBuilder("", " ") b.SetSkipEmptyStructures(true) // 👉 skip empty [] or {} for item, err := range iterjson.Parse(data) { errorz.MustZ(err) if item.Token.IsOpen() || item.Token.IsClose() { b.Add(item.Key, item.Token) continue } path := item.GetPathString() switch { case path == "name", strings.Contains(path, "address"): // continue default: continue } b.Add(item.Key, item.Token) } out := errorz.Must(b.Bytes()) fmt.Printf("\n--- filter: output json ---\n%s\n----------\n", out)


Ity ohatra ity dia hamerina JSON vaovao miaraka amin'ireo saha voasivana ihany:

 { "name": "Alice", "address": { "city": "The Sun", "zip": 10101 } }

8. Fanovana soatoavina

Ity dia ohatra iray amin'ny fanovana soatoavina amin'ny angona JSON. Eritrereto hoe mampiasa nomerao izahay ho an'ny API. Lehibe loatra ny id ary tsy zakany ny JavaScript. Mila manova azy ireo ho tady isika. Jereo ohatra/08.number_id sy order.json .


Avereno amin'ny angon-drakitra JSON, tadiavo ny saha _id rehetra ary ovay ho tady ny ID isa:

 b := iterjson.NewBuilder("", " ") for item, err := range iterjson.Parse(data) { errorz.MustZ(err) key, _ := item.GetRawPath().Last().ObjectKey() if strings.HasSuffix(key, "_id") { id, err0 := item.Token.GetInt() if err0 == nil { b.Add(item.Key, strconv.Itoa(id)) continue } } b.Add(item.Key, item.Token) } out := errorz.Must(b.Bytes()) fmt.Printf("\n--- convert number id ---\n%s\n----------\n", out)


Izany dia hanampy teny nindramina amin'ny id isa:

 { "order_id": "12345678901234", "number": 12, "customer_id": "12345678905678", "items": [ { "item_id": "12345678901042", "quantity": 1, "price": 123.45 }, { "item_id": "12345678901098", "quantity": 2, "price": 234.56 } ] }

Famaranana

Ny fonosana ezpkg.io/iter.json dia manome hery ny mpamorona Go hitantana ny angona JSON amin'ny fomba mazava sy mahomby. Na mila miverimberina amin'ny alàlan'ny rafitra JSON sarotra ianao, manangana zavatra JSON vaovao amin'ny fomba mavitrika, manamboatra na manalefaka ny angona, manivana saha manokana, na manova soatoavina mihitsy aza, iter.json dia manolotra vahaolana mora sy matanjaka.


Faly aho mizara ity fonosana ity amin'ny vondrom-piarahamonina ho fitaovana ho an'ny fanodikodinana JSON mahomby nefa tsy mila manara-maso tanteraka ny angon-drakitra. Na dia mbola eo am-pandrosoana aloha aza izy io ary misy toerana ho an'ny endri-javatra maro kokoa, dia efa miasa tsara ho an'ny tranga fampiasa mahazatra maro.


Raha manana fepetra manokana na hevitra hanatsarana ianao dia aza misalasala manatona — Tiako ny hihaino ny valinteninao ary hanampy amin'ny fanohanana ireo tranga fampiasanao! 🥳



Mpanoratra

Oliver Nguyen aho. Injeniera rindrambaiko miasa miaraka amin'i Go sy JS. Tiako ny mianatra sy mahita dikan-teny tsara kokoa momba ny tenako isan'andro. Atsaharo tsindraindray ny tetikasa open source vaovao. Mizara fahalalana sy eritreritra nandritra ny diako.


Navoaka tao amin'ny olivernguyen.io .

L O A D I N G
. . . comments & more!

About Author

Oliver Nguyen HackerNoon profile picture
Oliver Nguyen@olvrng
I’m a software maker working mostly in Go and JavaScript. Share knowledge and thoughts during my journey.

HANG TAGS

ITY ARTICLE ITY NO NARESAKA TAMIN'NY...