feat(json): 添加 JSON 编码示例和折扣产品结构

- 新增 DiscountedProduct 和 DiscountedProductChange 结构体
- 实现 mainJson 函数,包含多个 JSON 编码示例
- 更新 Product 结构体字段名称为导出形式
- 添加 mainJson1 到 mainJson7 的具体编码演示
-修复结构体标签和 JSON 序列化相关问题
This commit is contained in:
2025-10-17 23:37:46 +08:00
parent 20d5122def
commit d6d705b0bf
8 changed files with 284 additions and 2 deletions

View File

@@ -0,0 +1,13 @@
package main
type DiscountedProduct struct {
// *Product
*Product `json:",omitempty"`
Discount float64 `json:",string"`
}
type DiscountedProductChange struct {
// *Product `json:"product"`
*Product `json:"product,omitempty"`
Discount float64 `json:"-"`
}

View File

@@ -16,6 +16,7 @@ func main() {
main7()
main8()
main9()
mainJson()
}
func main1() {

View File

@@ -0,0 +1,230 @@
package main
import (
"encoding/json"
"fmt"
"io"
"strings"
)
func mainJson() {
mainJson1()
mainJson2()
mainJson3()
mainJson4()
mainJson5()
mainJson6()
mainJson7()
mainJson8()
mainJson9()
mainJson10()
mainJson11()
}
func mainJson1() {
Printfln("\nmainJson1")
b := true
str := "hello"
fVal := 99.99
iVal := 200
pointer := &iVal
var writer strings.Builder
encoder := json.NewEncoder(&writer)
for _, val := range []interface{}{b, str, fVal, iVal, pointer} {
err := encoder.Encode(val)
if err != nil {
Printfln("Error: %v", err.Error())
return
}
}
fmt.Println(writer.String())
}
func mainJson2() {
Printfln("\nmainJson2")
names := []string{"Kayak", "Lifejacket", "Soccer Ball"}
numbers := [3]int{1, 2, 3}
numberSlice := []int{1, 2, 3}
var byteArray [5]byte
copy(byteArray[0:], []byte(names[0]))
byteSlice := []byte(names[0])
var writer strings.Builder
encoder := json.NewEncoder(&writer)
encoder.Encode(names)
encoder.Encode(numbers)
encoder.Encode(numberSlice)
encoder.Encode(byteArray)
encoder.Encode(byteSlice)
fmt.Println(writer.String())
}
func mainJson3() {
Printfln("\nmainJson3")
m := map[string]float64{
"Kayak": 275,
"Lifejacket": 48.95,
}
var writer strings.Builder
encoder := json.NewEncoder(&writer)
encoder.Encode(m)
fmt.Println(writer.String())
}
func mainJson4() {
Printfln("\nmainJson4")
var writer strings.Builder
encoder := json.NewEncoder(&writer)
encoder.Encode(&Kayak)
fmt.Println(writer.String())
}
func mainJson5() {
Printfln("\nmainJson5")
var writer strings.Builder
encoder := json.NewEncoder(&writer)
dp := DiscountedProduct{
Product: &Kayak,
Discount: 10.50,
}
encoder.Encode(&dp)
fmt.Println(writer.String())
}
func mainJson6() {
Printfln("\nmainJson6")
var writer strings.Builder
encoder := json.NewEncoder(&writer)
dp := DiscountedProductChange{
Product: &Kayak,
Discount: 10.50,
}
encoder.Encode(&dp)
fmt.Println(writer.String())
}
func mainJson7() {
Printfln("\nmainJson7")
var writer strings.Builder
encoder := json.NewEncoder(&writer)
dp := DiscountedProductChange{
Product: &Kayak,
Discount: 10.50,
}
encoder.Encode(&dp)
dp2 := DiscountedProductChange{
Discount: 10.50,
}
encoder.Encode(&dp2)
dp3 := DiscountedProduct{
Discount: 10.50,
}
encoder.Encode(&dp3)
fmt.Println(writer.String())
}
func mainJson8() {
Printfln("\nmainJson8")
reader := strings.NewReader(`{"Kayak":279,"Lifejacket":49.95}`)
m := map[string]interface{}{}
decoder := json.NewDecoder(reader)
err := decoder.Decode(&m)
if err != nil {
Printfln("Error: %v", err.Error())
} else {
Printfln("Map: %T , %v", m, m)
for key, value := range m {
Printfln("Key: %v, Value: %v", key, value)
}
Printfln("Kayak: %v", m["Kayak"])
Printfln("Lifejacket: %v", m["Lifejacket"])
}
}
func mainJson9() {
Printfln("\nmainJson9")
reader := strings.NewReader(`{"Kayak":279,"Lifejacket":49.95}`)
m := map[string]float64{}
decoder := json.NewDecoder(reader)
err := decoder.Decode(&m)
if err != nil {
Printfln("Error: %v", err.Error())
} else {
Printfln("Map: %T , %v", m, m)
for key, value := range m {
Printfln("Key: %v, Value: %v", key, value)
}
Printfln("Kayak: %v", m["Kayak"])
Printfln("Lifejacket: %v", m["Lifejacket"])
}
}
func mainJson10() {
Printfln("\nmainJson10")
reader := strings.NewReader(`
{ "Name": "Kayak" , "Category": "Watersports","Price":270}
{ "Name": "Lifejacket" , "Category": "Watersports" }
{ "name": "Canoe" , "category": "Watersports" , "price" : 100 , "inStock" : true }
`)
decoder := json.NewDecoder(reader)
for {
var val Product
err := decoder.Decode(&val)
if err != nil {
if err == io.EOF {
break
}
Printfln("Error: %v", err.Error())
break
} else {
Printfln("Name: %v, Category: %v, Price: %v", val.Name, val.Category, val.Price)
}
}
}
func mainJson11() {
Printfln("\nmainJson10")
reader := strings.NewReader(`
{ "Name": "Kayak" , "Category": "Watersports","Price":270}
{ "Name": "Lifejacket" , "Category": "Watersports" }
{ "name": "Canoe" , "category": "Watersports" , "price" : 100 , "inStock" : true }
`)
decoder := json.NewDecoder(reader)
decoder.DisallowUnknownFields()
for {
var val Product
err := decoder.Decode(&val)
if err != nil {
if err == io.EOF {
break
}
Printfln("Error: %v", err.Error())
break
} else {
Printfln("Name: %v, Category: %v, Price: %v", val.Name, val.Category, val.Price)
}
}
}

View File

@@ -1,13 +1,13 @@
package main
type Product struct {
Name, category string
Name, Category string
Price float64
}
var Kayak = Product{
Name: "Kayak",
category: "Watersports",
Category: "Watersports",
Price: 279,
}

View File

@@ -0,0 +1,3 @@
module htmltext
go 1.22

View File

@@ -0,0 +1,5 @@
package main
func main() {
Printfln("Product: %v Price: %v", Kayak.Name, Kayak.Price)
}

View File

@@ -0,0 +1,7 @@
package main
import "fmt"
func Printfln(template string, values ...interface{}) {
fmt.Printf(template+"\n", values...)
}

View File

@@ -0,0 +1,23 @@
package main
type Product struct {
Name, Category string
Price float64
}
var Kayak = Product{
Name: "Kayak",
Category: "Watersports",
Price: 279,
}
var ProductList = []Product{
{"Kayak", "Watersports", 279},
{"LifeJacket", "Watersports", 49.95},
{"Soccer Ball", "Soccer", 19.50},
{"Corner Flags", "Soccer", 34.95},
{"Stadium", "Soccer", 79500},
{"Thinking Cap", "Chess", 16},
{"Unsteady Chair", "Chess", 75},
{"Bling-Bling King", "Chess", 1200},
}