JSON থেকে Go Struct
JSON থেকে Go struct তৈরি করুন
JSON ইনপুট
Go আউটপুট
JSON থেকে Go রূপান্তর কী?
JSON থেকে Go রূপান্তর কাঁচা JSON ডেটাকে Go টাইপ ডেফিনিশনে পরিণত করে, যা Go-র স্ট্যান্ডার্ড লাইব্রেরির encoding/json প্যাকেজের সাথে কাজ করে। Go স্ট্যাটিক্যালি টাইপড, তাই প্রতিটি JSON ফিল্ডের জন্য একটি সংশ্লিষ্ট স্ট্রাক্ট ফিল্ড দরকার সঠিক টাইপ ও স্ট্রাক্ট ট্যাগ সহ, যা সিরিয়ালাইজারকে জানায় কোন JSON কী ম্যাপ করতে হবে। বড় বা গভীরভাবে নেস্টেড API রেসপন্সের জন্য এই ডেফিনিশন হাতে লেখা ধীর ও ত্রুটিপ্রবণ।
encoding/json প্যাকেজ, Go 1.0 থেকে স্ট্যান্ডার্ড লাইব্রেরির অংশ, JSON কী-কে এক্সপোর্টেড স্ট্রাক্ট ফিল্ডে ম্যাপ করতে রিফ্লেকশন ব্যবহার করে। ম্যাচিং ডিফল্টে কেস-ইনসেনসিটিভ, কিন্তু স্পষ্ট json স্ট্রাক্ট ট্যাগ স্ট্যান্ডার্ড প্র্যাকটিস কারণ এটি অস্পষ্টতা দূর করে এবং JSON camelCase বা snake_case-এ থাকার সময় Go-র PascalCase কনভেনশন ব্যবহার করতে দেয়। একটি কনভার্টার এটি স্বয়ংক্রিয় করে: আপনার JSON পড়ে, মান থেকে Go টাইপ অনুমান করে এবং সঠিক ট্যাগ সহ স্ট্রাক্ট ডেফিনিশন আউটপুট করে।
Go-র টাইপ সিস্টেম JSON-এ পরিষ্কারভাবে ম্যাপ করে। স্ট্রিং string হয়, বুলিয়ান bool হয়, ইন্টিজার int হয় এবং ফ্লোটিং-পয়েন্ট সংখ্যা float64 হয়। নেস্টেড JSON অবজেক্টগুলো আলাদা নামযুক্ত স্ট্রাক্ট হয় এবং অ্যারেগুলো স্লাইস হয়। একটি জটিলতা হল null: Go-র কোনো সার্বজনীন nullable টাইপ নেই, তাই null মানগুলো সাধারণত পয়েন্টার টাইপ (*string, *int) বা interface{} হয়। একটি জেনারেটর মিলিসেকেন্ডে এসব সামলায়।
JSON থেকে Go কনভার্টার কেন ব্যবহার করবেন?
হাতে JSON থেকে Go স্ট্রাক্ট ডিফাইন করা মানে ব্রেস গণনা, টাইপ অনুমান এবং API পরিবর্তনের সাথে ট্যাগ পুনরায় লেখা। একটি কনভার্টার সেই ঝামেলা দূর করে।
JSON থেকে Go ব্যবহারের ক্ষেত্র
JSON থেকে Go টাইপ ম্যাপিং
encoding/json প্যাকেজ JSON মানকে Go টাইপে ম্যাপ করার সময় নির্দিষ্ট নিয়ম অনুসরণ করে। নিচের টেবিল ডিফল্ট ম্যাপিং ও সাধারণ বিকল্প দেখায়। "ডিফল্ট" কলামে বেশিরভাগ জেনারেটর কী তৈরি করে। "বিকল্প" কলামে এমন টাইপ আছে যা আপনি আপনার প্রয়োজন অনুযায়ী বেছে নিতে পারেন।
| JSON টাইপ | উদাহরণ | ডিফল্ট | বিকল্প |
|---|---|---|---|
| string | "hello" | string | string |
| number (integer) | 42 | int | int64 |
| number (float) | 3.14 | float64 | float64 |
| boolean | true | bool | bool |
| null | null | interface{} | *string / *int |
| object | {"k": "v"} | struct | struct |
| array of strings | ["a", "b"] | []string | []string |
| array of objects | [{"id": 1}] | []Item | []Item |
| mixed array | [1, "a"] | []interface{} | []interface{} |
Go JSON স্ট্রাক্ট ট্যাগ রেফারেন্স
স্ট্রাক্ট ট্যাগ নিয়ন্ত্রণ করে কীভাবে encoding/json ফিল্ড সিরিয়ালাইজ ও ডিসিরিয়ালাইজ করে। json ট্যাগ সবচেয়ে সাধারণ, কিন্তু একই ফিল্ডে অন্য ট্যাগ (db, yaml, xml) মিলিয়ে ব্যবহার করা যায়। ট্যাগ সিনট্যাক্স হল ফিল্ড টাইপের পরে ব্যাকটিক-ডিলিমিটেড স্ট্রিং। এখানে encoding/json সমর্থিত json ট্যাগ অপশনগুলো দেওয়া হল।
| ট্যাগ | আচরণ | ব্যবহারের ক্ষেত্র |
|---|---|---|
| json:"name" | Maps struct field to JSON key "name" | Always generated |
| json:"name,omitempty" | Omits field from output if zero value | Optional fields |
| json:"-" | Field is never serialized or deserialized | Internal fields |
| json:"name,string" | Encodes int/bool as JSON string | String-encoded numbers |
json.Unmarshal বনাম json.NewDecoder
Go JSON ডিকোড করার দুটি উপায় দেয়: বাইট স্লাইসের জন্য json.Unmarshal এবং io.Reader স্ট্রিমের জন্য json.NewDecoder। উভয়ই একই স্ট্রাক্ট ট্যাগ নিয়ম ব্যবহার করে, কিন্তু কখন ব্যবহার করবেন তা ভিন্ন।
কোড উদাহরণ
এই উদাহরণগুলো দেখায় কীভাবে JSON থেকে জেনারেটেড Go স্ট্রাক্ট বাস্তব প্রোগ্রামে ব্যবহার করতে হয় এবং অন্যান্য ভাষা থেকেও কীভাবে জেনারেট করা যায়। Go উদাহরণগুলো স্ট্যান্ডার্ড লাইব্রেরির encoding/json ব্যবহার করে।
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
IsActive bool `json:"is_active"`
Tags []string `json:"tags"`
}
func main() {
data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
panic(err)
}
fmt.Println(user.Name) // → Alice
fmt.Println(user.Tags) // → [admin editor]
}// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }
// Equivalent Go struct:
// type User struct {
// ID int `json:"id"`
// Name string `json:"name"`
// Email string `json:"email"`
// }import json
def json_to_go(data: dict, name: str = "Root") -> str:
lines = [f"type {name} struct {{"]
type_map = {str: "string", int: "int", float: "float64", bool: "bool"}
for key, value in data.items():
go_type = type_map.get(type(value), "interface{}")
field = key.title().replace("_", "") # snake_case → PascalCase
lines.append(f'\t{field} {go_type} `json:"{key}"`')
lines.append("}")
return "\n".join(lines)
data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
# UserName string `json:"user_name"`
# Age int `json:"age"`
# Verified bool `json:"verified"`
# }package main
import (
"encoding/json"
"fmt"
"strings"
)
type Event struct {
Type string `json:"type"`
Payload string `json:"payload"`
}
func main() {
stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)
dec := json.NewDecoder(stream)
for dec.More() {
var ev Event
if err := dec.Decode(&ev); err != nil {
break
}
fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
}
// → click: btn-1
// → scroll: page-2
}