Skip to main content
0

สรุปสั้น ๆ

สวัสดีครับ ! ในบทความนี้เราจะมาทำความรู้จักกับ JSON และกระบวนท่าต่าง ๆ ในภาษา Go ให้ทำงานร่วมกับ JSON ได้ จะมีวิธีการยังไงบ้างไปดูกัน !!

เขียนโดย
Sirasit Boonklang (Aeff)
Tech and Coding Consultant

บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 03 มีนาคม 2566

สิ่งที่จะได้เรียนรู้ในบทความ

1. รู้จักกับ JSON
2. แปลง Go Object → JSON จาก map
3. แปลง Go Object → JSON จาก struct
4. การทำให้ output JSON ดูง่ายขึ้นด้วย `MarshalIndent`
5. การแปลง JSON ไปเป็น Go Object
6. การอ่านไฟล์ JSON
7. การเขียนไฟล์ JSON
8. ตัวช่วยในการแปลง JSON-to-Go

1. รู้จักกับ JSON

JSON ย่อมาจาก JavaScript Object Notation เป็นรูปแบบข้อมูลในการจัดเก็บและแลกเปลี่ยนข้อมูล เป็นรูปแบบของข้อมูลที่นิยมใช้ เอาไว้แลกเปลี่ยนข้อมูลระหว่างเซิร์ฟเวอร์ เว็บแอปพลิเคชัน แอปมือถือและซอฟต์แวร์ โปรแกรมต่าง ๆ ใน JSON ข้อมูลจะถูกจัดระเบียบเป็นคู่ มี key กับ value แต่ละ key เป็น string และแต่ละ value อาจเป็น string, number, boolean, array, หรือ JSON object อื่น ๆ ก็ได้

หน้าตาของ JSON

{
   "key", value
}

หน้าตาของ JSON

{
   "key", value
}

โดยในการสร้าง Web Service ด้วย Go สามารถทำได้หลายแบบไม่ว่าจะเป็นใช้ Framework หรือจะใช้เป็น Standard Package อย่าง net/http ที่มาพร้อมกับ Go อยู่แล้วก็ได้ ในแพ็คเกจนี้มีเครื่องมือที่จำเป็นทั้งหมดในการสร้าง Web Service รวมถึงการกำหนด Route การให้บริการไฟล์ และการจัดการ HTTP requests/responses ต่าง ๆ

ตัวอย่างข้อมูล

{
    "name": "Aef",
    "age": 24,
    "pets": ["dog", "cat"]
}

เมื่อเราได้รู้จักกับไฟล์ JSON แบบไว ๆ กันไปแล้วเดี๋ยวเรามาดูวิธีการใช้งานไฟล์ JSON กับ Go กันดีกว่า

โดยในภาษา Go จะมี Standard Library หรือ Package ที่มากับ Go อยู่แล้วไม่ต้องลงเพิ่ม นัjนก็คือ encoding/json package โดยเจ้าตัวนี้มันมี API สำหรับสร้าง JSON documents จาก Go Object อยู่

และสามารถแปลงไปแปลงกลับ จาก JSON ไป Go จาก Go ไป JSON ได้

แปลงจาก Go Object ไปเป็น JSON ใช้ Marshaling

การแปลงจาก Go Object ไปเป็น JSON จะทำการเข้ารหัส Go Object ไปเป็นรูปแบบ JSON โดยใช้สิ่งที่เรียกว่า marshaling โดย marshaling ใช้เมื่อต้องการส่งหรือจัดเก็บข้อมูลในรูปแบบที่สามารถอ่านและเข้าใจได้ง่ายโดยแอปอื่น ๆ โดย marshaling ใน Go มี syntax ดังนี้

func Marshal(v interface{}) ([]byte, error)

โดยฟังก์ชันนี้จะรับ interface ว่าง ๆ โดยเราสามารถใช้เป็นข้อมูลประเภทใดก็ได้ ไม่ว่าจะเป็น int, float, string, map, struct หรือ อื่น ๆ แล้วตัวฟังก์ชันนี้จะ return ข้อมูลมา 2 ตัวนั้นคือ []byte(JSON ที่เข้ารหัส, error)

2. แปลง Go Object → JSON จาก map

ชื่อไฟล์ : Simple_GO2JSON.go

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	Coffee := map[string]int{
		"Latte":      55,
		"Cappuccino": 50,
		"Americano":  45,
	}
	bytes, _ := json.Marshal(Coffee)
	fmt.Println(string(bytes))
}

ผลที่ได้จากการรันโปรแกรมด้านบน โดยใช้คำสั่ง go run Simple_GO2JSON.go

หากต้องการดูชนิดของตัวแปรของผลลัพธ์ด้วยก็สามารถใช้ print format ด้วย fmt.Printf() ภายใน “ “ ให้ใช้เป็น %T แล้วแทนส่วนที่จะแสดงชนิดของตัวแปรนั้น ๆ ได้เลย

//ตรวจสอบชนิดของผลลัพธ์
fmt.Printf("Type of bytes %T\n", bytes)

ลองทำการรันอีกครั้งในไฟล์เดิม ด้วยคำสั่ง go run Simple_Go2JSON.go

3. แปลง Go Object → JSON จาก struct

นอกจากท่าที่เราจะใช้ map แล้ว เรายังสามารถเข้ารหัส JSON จาก struct ได้ จากตัวอย่างโค้ดด้านล่างนี้

เราจะทำการกำหนด struct ของ Coffee ที่ภายในจะมี 3 ฟิลด์ดังนี้ Menu, Price และ Quantity แล้วใน main ฟังก์ชันจะมีการสร้าง object หลังจากนั้นใช้ฟังก์ชัน `json.Marshal()` ในการแปลง object ไปเป็น JSON ฟังก์ชันนี้จะ return err กับ ข้อมูลที่เป็น bytes มา เราสามารถใช้ string ในการครอบข้อมูล bytes ให้แสดงมาเป็น string แล้วทำการใช้ `fmt.Println()` ในการแสดงผลลัพธ์ออกมา

ชื่อไฟล์ : Simple_Go2JSON_struct.go

package main

import (
	"encoding/json"
	"fmt"
)

type Coffee struct {
	Menu     string
	Price    int
	Quantity int
}

func main() {
	myCoffee := Coffee{"Cappuccino", 50, 2}
	bytes, _ := json.Marshal(myCoffee)
	fmt.Println(string(bytes))
}

เมื่อเขียนโค้ดเสร็จเราก็ทำการรันโปรแกรม โดยใช้คำสั่ง go run Simple_Go2JSON_struct.go และจะได้ผลลัพธ์ออกมาอยู่ในรูปแบบ JSON นั่นเอง !!!

เมื่อกี้เราได้ดูตัวอย่างง่าย ๆ อีซี่ ๆ กันไปแล้ว ลองทำให้มันซับซ้อนขึ้นหน่อยดีกว่า โดยเราจะเริ่มจากการที่มีการกำหนดให้ JSON ที่ข้อมูลผลลัพธ์ของเรามี object ซ้อน object กัน แล้วพอเป็นโค้ดใน Go หากเราต้องการแปลงให้ออกมาเป็น JSON เดี๋ยวเรามาดูกันว่าต้องจัดการหรือมีขั้นตอนใดบ้าง

  • เริ่มจากทำการจัด struct ของข้อมูล กำหนดว่าแต่ละฟิลด์ชื่ออะไร ชนิดเป็นอะไร และกำหนด key ของ JSON ในแต่ละฟิลด์ หากต้องการทำ struct ซ้อน struct ก็สามารถกำหนดฟิลด์ที่เป็นชนิดของ struct นั้น ๆ ได้เลย ในตัวอย่างนี้จะใช้เป็น Ingredient ที่เป็น struct และเป็นฟิลด์หนึ่งใน struct ชื่อว่า `MenuItem`
  • เมื่อเราทำการสร้าง struct ของข้อมูลเรียบร้อยแล้วก็ลองทำการสร้าง object ของข้อมูลตัวอย่างเอาไว้ โดยในตัวอย่างนี้จะให้ object เก็บอยู่ในตัวแปรชื่อว่า menu
  • แล้วเราก็ใช้ฟังก์ชัน `json.Marshal()` ในการแปลง Go Object เป็น JSON
  • แล้วรอบนี้เราจะทำการรับ error มาด้วย แล้วก็เช็ค error ด้วยคำสั่ง
if err != nil {
    fmt.Println("Error:", err)
    return
  }
  • ถ้าเกิดว่าไม่มี error มันก็จะทำการแปลงออกมาเป็น bytes แล้วเราก็ครอบ string และทำการ println ออกมาเหมือนกับตัวอย่างก่อนหน้านี้ได้เลยยย
package main

import (
	"encoding/json"
	"fmt"
)

type Ingredient struct {
	Name     string `json:"name"`
	Quantity int    `json:"quantity"`
	Unit     string `json:"unit"`
}

type MenuItem struct {
	Name        string       `json:"name"`
	Description string       `json:"description"`
	Price       float64      `json:"price"`
	Ingredients []Ingredient `json:"ingredients"`
}

func main() {
	// Define a slice of menu items
	menu := []MenuItem{
		{
			Name:        "Americano",
			Description: "A classic espresso drink",
			Price:       2.50,
			Ingredients: []Ingredient{
				{
					Name:     "Espresso",
					Quantity: 1,
					Unit:     "shot",
				},
				{
					Name:     "Water",
					Quantity: 6,
					Unit:     "oz",
				},
			},
		},
		{
			Name:        "Latte",
			Description: "Espresso with steamed milk",
			Price:       4.00,
			Ingredients: []Ingredient{
				{
					Name:     "Espresso",
					Quantity: 2,
					Unit:     "shot",
				},
				{
					Name:     "Milk",
					Quantity: 8,
					Unit:     "oz",
				},
			},
		},
	}

	// Marshal the menu items as a JSON string
	jsonString, err := json.Marshal(menu)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// Print the JSON string to the console
	fmt.Println(string(jsonString))
}

เมื่อเราทำการรันด้วยคำสั่ง go run Simple_Go2JSON_struct_complex.go จะเห็นได้ว่าผลลัพธ์ก็ออกมาแล้ว แต่มันจะดูยากไปหน่อย เพราะมันต่อกันเป็นพรืดเลยยย ที่นี้เดียวเรามาดูวิธีแก้ในข้อต่อไปกัน !!!

4. การทำให้ output JSON ดูง่ายขึ้นด้วย MarshalIndent

วิธีแก้เราสามารถใช้ json.MarshalIndent() แทน json.Marshal() โดย MarshalIndent เหมือนกับ Marshal แต่ใช้ Indent เพื่อจัดรูปแบบของผลลัพธ์มาให้ด้วย ส่วนของโค้ดนี้จะสามารถใช้กับไฟล์ด้านบนได้เลย แค่เปลี่ยนจาก json.Marshal() ไปเป็น json.MarshalIndent()

jsonString, err := json.MarshalIndent(menu, "", " ")
  if err != nil {
    fmt.Println("Error:", err)
    return
}

หลังจากนั้นสามารถรันอีกครั้งโดยใช้คำสั่ง go run Simple_Go2JSON_struct_complex.go แล้วผลลัพธ์จะออกมาเป็น JSON ที่มีหน้าตาสวยงาม อ่านง่ายแล้วนั่นเอง

ต่อมา…แล้วถ้าเกิดว่าเราต้องการที่จะให้บางฟิลด์ไม่แสดง เราก็สามารถใช้ – เพื่อทำการ ignore ฟิลด์นั้น ๆ ได้ว่าไม่ต้องแสดงนะ แต่ก็ยังรับข้อมูลนั้นมาอยู่


type MenuItem struct {
  Name string `json:"name"`
  Description string `json:"-"`
  Price float64 `json:"price"`
  Ingredients []Ingredient `json:"-"`
}

เมื่อลองทำการรันอีกครั้งจะเห็นว่าผลลัพธ์จะแสดงเฉพาะฟิลด์ที่เราไม่ได้กำหนดให้ ignore ผ่านเครื่องหมาย

เมื่อเราได้ทำการเรียนรู้เกี่ยวกับวิธีในการแปลง Go Object ไปเป็น JSON พร้อมเทคนิคในการทำให้ผลลัพธ์ออกมาสวยงามอ่านง่ายแล้ว ต่อมาเราก็จะต้องมาดูวิธีในการแปลงจาก JSON ให้ไปเป็น Go Object เอาไว้ใช้เวลาที่เราต้องการรับข้อมูลที่เป็น JSON มา แล้วต้องการแปลงเป็น object เพื่อที่จะเอาไปประมวลผลต่อ

5. การแปลง JSON ไปเป็น Go Object

โดยในการแปลงกลับจาก JSON Format ให้เป็น Go Object เราจะใช้ฟังก์ชันชื่อว่า json.Unmarshal() โดยใส่ค่าตัวแปรที่มีข้อมูล JSON เข้าไปใน []byte(ตัวแปรที่มีข้อมูลJSON) และ &ของโครงสร้างข้อมูลที่เราสร้างเอาไว้รอข้อมูลนี้แล้ว หลังจากนั้นฟังก์ชันนี้จะทำการคืนค่า err ออกมาแล้วเราก็ทำการเช็ค error แล้วทำการแสดงผลลัพธ์ออกมาผ่านทาง fmt.Printf()

ชื่อไฟล์ : Simple_Unmarshaling.go

package main

import (
	"encoding/json"
	"fmt"
)

type MenuItem struct {
	Name        string  `json:"name"`
	Description string  `json:"description"`
	Price       float64 `json:"price"`
}

func main() {
	// Define a JSON string representing a menu item
	jsonString := `{
        "name": "Americano",
        "description": "A classic espresso drink",
        "price": 2.50
    }`

	// Unmarshal the JSON string into a MenuItem struct
	var menuItem MenuItem
	err := json.Unmarshal([]byte(jsonString), &menuItem)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// Print the menu item to the console
	fmt.Printf("%s (%s): $%.2f\n", menuItem.Name, menuItem.Description, menuItem.Price)
}

หลังจากที่เราได้ทำการเขียนเสร็จแล้วก็ทำการรันด้วยคำสั่ง go run Simple_Unmarshaling.go จะเห็นได้ว่าข้อมูลออกมาแล้วในรูปแบบของ Go Object

เมื่อเราดูตัวอย่างแบบง่าย ๆ อี่ซี่ ๆ ไปแล้ว ก็มาลองแปลง JSON ไปเป็น Go Object ที่มีความยากและซับซ้อนขึ้นอีกหน่อย โดยการกำหนด struct ของข้อมูลจะเหมือนกับไฟล์ Simple_Go2JSON_struct_complex.go เลย

แต่เราจะกำหนดข้อมูลที่เป็น JSON มา แล้วทำการใช้ json.Unmarshal() แสดงผลการแปลง JSON ไปเป็น Go Object แบบโค้ดด้านบนได้เลย

package main

import (
    "encoding/json"
    "fmt"
)

type Ingredient struct {
    Name     string `json:"name"`
    Quantity int    `json:"quantity"`
    Unit     string `json:"unit"`
}

type MenuItem struct {
    Name        string       `json:"name"`
    Description string       `json:"description"`
    Price       float64      `json:"price"`
    Ingredients []Ingredient `json:"ingredients"`
}

func main() {
    // Define a JSON string representing a slice of menu items
    jsonString := `[
        {
            "name": "Americano",
            "description": "A classic espresso drink",
            "price": 2.50,
            "ingredients": [
                {
                    "name": "Espresso",
                    "quantity": 1,
                    "unit": "shot"
                },
                {
                    "name": "Water",
                    "quantity": 6,
                    "unit": "oz"
                }
            ]
        },
        {
            "name": "Latte",
            "description": "Espresso with steamed milk",
            "price": 4.00,
            "ingredients": [
                {
                    "name": "Espresso",
                    "quantity": 2,
                    "unit": "shot"
                },
                {
                    "name": "Milk",
                    "quantity": 8,
                    "unit": "oz"
                }
            ]
        }
    ]`

    // Unmarshal the JSON string into a slice of MenuItem structs
    var menuItems []MenuItem
    err := json.Unmarshal([]byte(jsonString), &menuItems)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // Print the name, description, and price of each menu item to the console
    for _, menuItem := range menuItems {
        fmt.Printf("%s (%s): $%.2f\n", menuItem.Name, menuItem.Description, menuItem.Price)
    }
}

เมื่อเราทำการแปลงเสร็จเรียบร้อยก็ทำการแสดงผลลัพธ์โดยการรัน go run Simple_Unmarshaling_complex.go

เมื่อเราทำการแปลงไป-แปลงกลับระหว่าง Go กับ JSON แล้วต่อมาเรามาดูวิธีการเขียนและอ่านไฟล์ JSON

โดยเราต้องมีตัวอย่างข้อมูล JSON มาก่อน และในที่นี้เราจะสร้างไฟล์ตัวอย่างขึ้นมาชื่อว่า `coffee.json`

ชื่อไฟล์ : coffee.json

[
        {
            "name": "Americano",
            "description": "A classic espresso drink",
            "price": 2.50,
            "ingredients": [
                {
                    "name": "Espresso",
                    "quantity": 1,
                    "unit": "shot"
                },
                {
                    "name": "Water",
                    "quantity": 6,
                    "unit": "oz"
                }
            ]
        },
        {
            "name": "Latte",
            "description": "Espresso with steamed milk",
            "price": 4.00,
            "ingredients": [
                {
                    "name": "Espresso",
                    "quantity": 2,
                    "unit": "shot"
                },
                {
                    "name": "Milk",
                    "quantity": 8,
                    "unit": "oz"
                }
            ]
        }
    ]

6. การอ่านไฟล์ JSON

โดยในการอ่านไฟล์เราจะใช้ package io/ioutil มาใช้ในการอ่านเขียนไฟล์ ต่อมาเราจะมาเริ่มโดยการสร้าง struct ของข้อมูลมาเตรียมไว้ก่อน แล้วใช้ ioutil.ReadFile() ในการอ่านไฟล์มา ด้านในก็ทำการใส่ชื่อไฟล์หรือ path เข้าไป หลังจากนั้นทำการเช็ค error แล้วทำการแยกข้อมูลใน JSON และแปลงไปเป็น Go Object ด้วย json.Unmarshal(bytes, &coffees) นั่นเอง

ชื่อไฟล์ : ReadJSON.go

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
)

type Ingredient struct {
	Name     string `json:"name"`
	Quantity int    `json:"quantity"`
	Unit     string `json:"unit"`
}

type Coffee struct {
	Name        string       `json:"name"`
	Description string       `json:"description"`
	Price       float64      `json:"price"`
	Ingredients []Ingredient `json:"ingredients"`
}

func main() {
	// Read the JSON file
	bytes, err := ioutil.ReadFile("coffee.json")
	if err != nil {
		log.Fatal(err)
	}

	// Parse the JSON data
	var coffees []Coffee
	err = json.Unmarshal(bytes, &coffees)
	if err != nil {
		log.Fatal(err)
	}

	// Print the coffee data
	for _, coffee := range coffees {
		fmt.Printf("Name: %s\n", coffee.Name)
		fmt.Printf("Description: %s\n", coffee.Description)
		fmt.Printf("Price: %.2f\n", coffee.Price)
		fmt.Println("Ingredients:")
		for _, ingredient := range coffee.Ingredients {
			fmt.Printf("- %s: %d %s\n", ingredient.Name, ingredient.Quantity, ingredient.Unit)
		}
		fmt.Println()
	}
}

เมื่อทำการเขียนโค้ดเสร็จแล้วเราก็ทำการลองรันโดยใช้คำสั่ง go run ReadJSON.go

7.เขียนไฟล์ JSON

ต่อมาเรามาที่กระบวนท่าสุดท้ายนั่นคือการเขียนไฟล์ JSON ของเรานั่นเอง โดยเราจะใช้ package os เพื่อที่จะใช้ฟังก์ชันในการเขียนไฟล์ต่าง ๆ โดยจากโค้ดด้านล่างเราก็ทำการสร้าง struct รอไว้เหมือนตัวอย่างก่อน ๆ โดยในโค้ดนี้ให้เราไปโฟกัสที่คำสั่ง os.Create() เป็นคำสั่งในการสร้างไฟล์ ด้านในเราสามารถใส่ชื่อไฟล์และ path ลงไปได้ หลังจากนั้นก็นำค่าเก็บไว้ในตัวแปรที่ชื่อว่า file ในฟังก์ชัน json.NewEncoder() เพื่อทำการเข้ารหัสข้อมูลให้เป็น JSON แล้วเขียนลงไปในไฟล์นั่นเอง

ชื่อไฟล์ : WriteJSON.go

package main

import (
	"encoding/json"
	"log"
	"os"
)

type Ingredient struct {
	Name     string `json:"name"`
	Quantity int    `json:"quantity"`
	Unit     string `json:"unit"`
}

type Coffee struct {
	Name        string       `json:"name"`
	Description string       `json:"description"`
	Price       float64      `json:"price"`
	Ingredients []Ingredient `json:"ingredients"`
}

func main() {
	// Define a slice of Coffee structs
	coffees := []Coffee{
		{
			Name:        "Americano",
			Description: "A classic espresso drink",
			Price:       2.50,
			Ingredients: []Ingredient{
				{Name: "Espresso", Quantity: 1, Unit: "shot"},
				{Name: "Water", Quantity: 6, Unit: "oz"},
			},
		},
		{
			Name:        "Latte",
			Description: "Espresso with steamed milk",
			Price:       4.00,
			Ingredients: []Ingredient{
				{Name: "Espresso", Quantity: 2, Unit: "shot"},
				{Name: "Milk", Quantity: 8, Unit: "oz"},
			},
		},
	}

	// Open the file for writing
	file, err := os.Create("coffe-new.json")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// Encode the coffee data as JSON and write it to the file
	encoder := json.NewEncoder(file)
	err = encoder.Encode(coffees)
	if err != nil {
		log.Fatal(err)
	}
}

เมื่อเราลองทำการรันก็จะได้ไฟล์ coffee-new.json มาแล้วววว

8. ตัวช่วยในการแปลง JSON-to-Go

จากการทำตัวอย่างด้านบนจะเห็นว่าส่วนที่ทรหด ต้องอดทนหน่อยจะเป็นขั้นตอนที่เรามีข้อมูล JSON อยู่แล้วต้องมานั่งแกะ แยกข้อมูลเพื่อมาเขียน struct เองใช่มั้ยครับ ? ผมขอแนะนำเว็บ https://mholt.github.io/json-to-go/ เอาไว้สำหรับตอนที่เราได้ข้อมูล JSON มาก้อนนึงเราก็โยนเข้าเว็บนี้แล้วเราก็จะได้ struct มาเลย

และนี่นะครับก็เป็นเนื้อหาเล็ก ๆ น้อย ๆ สำหรับการใช้ Go คู่กับข้อมูลแบบ JSON นั่นเอง ไม่ยากเลยใช่มั้ยครับ สำหรับบทนี้

หากใครมีปัญหาติดตรงไหนสามารถสอบถามได้เลยที่ BorntoDev Discord Community 😊 : https://discord.com/invite/wam6MYrfND

ระบบฝึกทักษะ การเขียนโปรแกรม

ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง

  • โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
  • รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
  • ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า