paint-brush
Funksioni i ri në Go e bën më të lehtë përsëritjen, manipulimin e të dhënave JSONnga@olvrng
Histori e re

Funksioni i ri në Go e bën më të lehtë përsëritjen, manipulimin e të dhënave JSON

nga Oliver Nguyen13m2024/12/17
Read on Terminal Reader

Shume gjate; Te lexosh

Po sikur të mund të kaloni nëpër të dhënat tuaja JSON, të kapni shtegun e secilit artikull dhe të vendosni saktësisht se çfarë të bëni me të menjëherë?
featured image - Funksioni i ri në Go e bën më të lehtë përsëritjen, manipulimin e të dhënave JSON
Oliver Nguyen HackerNoon profile picture

A të është dashur ndonjëherë të modifikosh të dhënat e pastrukturuara JSON në Go? Ndoshta ju është dashur të fshini fjalëkalimin dhe të gjitha fushat e listës së zezë, të riemërtoni çelësat nga camelCase snake_case , ose të konvertoni të gjitha ID-të e numrave në vargje sepse JavaScript nuk i pëlqen int64 ? Nëse zgjidhja juaj ka qenë të zhbërë çdo gjë në një map[string]any duke përdorur encoding/json dhe më pas ta rikthejë atë... mirë, le ta pranojmë, kjo nuk është aspak efikase!


Po sikur të mund të kaloni nëpër të dhënat JSON, të kapni shtegun e secilit artikull dhe të vendosni saktësisht se çfarë të bëni me të menjëherë?


po! Kam një lajm të mirë! Me veçorinë e re të përsëritësit në Go 1.23, ka një mënyrë më të mirë për të përsëritur dhe manipuluar JSON. Takoni ezpkg.io/iter.json - shoqëruesin tuaj të fuqishëm dhe efikas për të punuar me JSON në Go.


1. Përsëritja e JSON

Duke pasur parasysh që kemi një skedar alice.json :

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


Së pari, le të përdorim for range Parse() për të përsëritur mbi skedarin JSON, më pas të printojmë shtegun, çelësin, tokenin dhe nivelin e secilit artikull. Shih shembuj/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) } }


Kodi do të dalë:

 | 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. Ndërtimi i JSON

Përdorni Builder për të ndërtuar të dhëna JSON. Ai pranon argumente opsionale për dhëmbëzimin. Shih shembuj/02.ndërtues .

 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)


Cili do të nxjerrë JSON me indentacion:

 { "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. Formatimi i JSON

Mund të rindërtoni ose formatoni një të dhënë JSON duke dërguar çelësin dhe vlerat e tij te një Builder . Shih shembuj/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) }


Shembulli i parë minimizon JSON ndërsa shembulli i dytë e formaton atë me prefiksin "👉" në çdo rresht.

 --- 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. Shtimi i numrave të rreshtave

Në këtë shembull, ne shtojmë numrat e linjës në daljen JSON, duke shtuar një b.WriteNewline() përpara thirrjes fmt.Fprintf() . Shih shembujt/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)


Kjo do të nxjerrë:

 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. Shtimi i komenteve

Duke vendosur një fmt.Fprintf(comment) midis b.WriteComma() dhe b.WriteNewline() , mund të shtoni një koment në fund të çdo rreshti. Shih shembuj/05.koment .

 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)


Kjo do të nxjerrë:

 { // 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. Filtrimi i JSON dhe nxjerrja e vlerave

Ka item.GetPathString() dhe item.GetRawPath() për të marrë shtegun e artikullit aktual. Ju mund t'i përdorni ato për të filtruar të dhënat JSON. Shih shembuj/06.filter_print .


Shembull me item.GetPathString() dhe 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()) }


Shembull me item.GetRawPath() dhe 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()) }


Të dy shembujt do të nxjerrin:

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

7. Filtrimi i JSON dhe kthimi i një JSON të ri

Duke kombinuar Builder me opsionin SetSkipEmptyStructures(false) dhe logjikën e filtrimit, mund të filtrosh të dhënat JSON dhe të kthesh një JSON të ri. Shih shembuj/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)


Ky shembull do të kthejë një JSON të ri me vetëm fushat e filtruara:

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

8. Redaktimi i vlerave

Ky është një shembull për modifikimin e vlerave në një të dhënë JSON. Supozoni se po përdorim ID-të e numrave për API-në tonë. ID-të janë shumë të mëdha dhe JavaScript nuk mund t'i trajtojë ato. Ne duhet t'i konvertojmë ato në vargje. Shih shembuj/08.number_id dhe order.json .


Përsëriteni mbi të dhënat JSON, gjeni të gjitha fushat _id dhe konvertoni id-të e numrave në vargje:

 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)


Kjo do t'i shtojë kuotat ID-ve të numrave:

 { "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 } ] }

konkluzioni

Paketa ezpkg.io/iter.json fuqizon zhvilluesit Go për të trajtuar të dhënat JSON me saktësi dhe efikasitet. Pavarësisht nëse keni nevojë të përsërisni përmes strukturave komplekse JSON, të ndërtoni objekte të reja JSON në mënyrë dinamike, të formatoni ose minimizoni të dhënat, të filtroni fusha specifike apo edhe të transformoni vlera, iter.json ofron një zgjidhje fleksibël dhe të fuqishme.


Jam i ngazëllyer ta ndaj këtë paketë me komunitetin si një mjet për manipulimin efektiv të JSON pa pasur nevojë për analizimin e plotë të të dhënave. Ndërsa është ende në zhvillim të hershëm dhe ka vend për më shumë veçori, ai tashmë funksionon mirë për shumë raste të përdorimit të zakonshëm.


Nëse keni kërkesa ose ide specifike për përmirësim, mos ngurroni të kontaktoni - do të doja të dëgjoja komentet tuaja dhe të ndihmoja në mbështetjen e rasteve tuaja të përdorimit! 🥳



Autori

Unë jam Oliver Nguyen. Një inxhinier softuerësh që punon me Go dhe JS. Më pëlqen të mësoj dhe të shoh një version më të mirë të vetes çdo ditë. Herë pas here spin off projekte të reja me burim të hapur. Ndani njohuritë dhe mendimet gjatë udhëtimit tim.


Postimi është publikuar edhe në 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.

VARUR TAGS

KY ARTIKU U PARAQIT NË...