json 潜逃 结构体_Golang中JSON解析结构体

一、StructTag介绍

StructTag是go语言结构体中的一个标记字段,放在字段声明的后面,一般只有特定情况下会用到,如json的转化。

使用的时候只要把标记的字段用两个`包起来即可,标签内的语法形式通常为key:"value",多个标记用空格隔开。

type tagTest struct {

tagA string `TagA`

tagB int `TagB`

}

1

2

3

4

typetagTeststruct{

tagAstring`TagA`

tagBint`TagB`

}

二、Struct转Json

要想把struct转化成json,只要把结构体内的字段名设置成导出状态,也就是把首字母大写就行了,默认情况下,转化后的json中的key值和结构体中的字段名是一样的。

package main

import (

"fmt"

"encoding/json"

)

type addr struct {

Province string

City string

}

type stu struct {

Name string

Age int

Addr addr

}

func main(){

var xm = stu{Name:"xiaoming", Age:18, Addr:addr{Province:"Hunan",City:"ChangSha"}}

js, err := json.Marshal(xm)

if err != nil{

fmt.Println(err)

return

}

fmt.Println(string(js)) //输出{"Name":"xiaoming","Age":18,"Addr":{"Province":"Hunan","City":"ChangSha"}}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

packagemain

import(

"fmt"

"encoding/json"

)

typeaddrstruct{

Provincestring

Citystring

}

typestustruct{

Namestring

Ageint

Addraddr

}

funcmain(){

varxm=stu{Name:"xiaoming",Age:18,Addr:addr{Province:"Hunan",City:"ChangSha"}}

js,err:=json.Marshal(xm)

iferr!=nil{

fmt.Println(err)

return

}

fmt.Println(string(js))//输出{"Name":"xiaoming","Age":18,"Addr":{"Province":"Hunan","City":"ChangSha"}}

}

三、Json转struct

而在把json转化成struct的时候,要求json和结构体的字段一致才能被成功转化,否则转化后的数据就可能和我们想的不一样。

要注意的是这里可以忽略大小写。

package main

import (

"fmt"

"encoding/json"

)

type addr struct {

Province string

City string

}

type stu struct {

Name string

Age int

Addr addr

}

func main(){

js := `{"Age":18,"name":"xiaoming","Addr":{"Province":"Hunan","City":"ChangSha"}}` //name是小写

var xm stu

err := json.Unmarshal([]byte(js), &xm)

if err != nil{

fmt.Println(err)

return

}

fmt.Println(xm) //输出{xiaoming 18 {Hunan ChangSha}}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

packagemain

import(

"fmt"

"encoding/json"

)

typeaddrstruct{

Provincestring

Citystring

}

typestustruct{

Namestring

Ageint

Addraddr

}

funcmain(){

js:=`{"Age":18,"name":"xiaoming","Addr":{"Province":"Hunan","City":"ChangSha"}}`//name是小写

varxmstu

err:=json.Unmarshal([]byte(js),&xm)

iferr!=nil{

fmt.Println(err)

return

}

fmt.Println(xm)//输出{xiaoming 18 {Hunan ChangSha}}

}

四、使用tag

以上都没有tag就能相互转化,说起来好像tag并没有什么用!事实的确也就是这样,tag其实在这里并不是必需的。

但如果我们期望转化后的json字段名和struct里的不一样的话,就得用到tag了。

tag在这里的用途就是提供别名,让两者的转化更加灵活。

tag的使用格式为json:"***" 、‘(***我们期望json转化过后的名字)

package main

import (

"fmt"

"encoding/json"

)

type addr struct {

Province string `json:"province"` //转化后对应字段的json名为province

City string `json:"city"`

}

type stu struct {

Name string `json:"name"`

Age int `json:"age"`

Addr addr `json:"addr"`

}

func main(){

var xm = stu{Name: "xiaoming", Age: 18, Addr:addr{Province:"Hunan",City:"ChangSha"}}

js, err := json.Marshal(xm)

if err != nil{

fmt.Println(err)

return

}

fmt.Println(string(js))

var xxm stu

err = json.Unmarshal(js, & xxm)

fmt.Println(xxm)

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

packagemain

import(

"fmt"

"encoding/json"

)

typeaddrstruct{

Provincestring`json:"province"`//转化后对应字段的json名为province

Citystring`json:"city"`

}

typestustruct{

Namestring`json:"name"`

Ageint`json:"age"`

Addraddr`json:"addr"`

}

funcmain(){

varxm=stu{Name:"xiaoming",Age:18,Addr:addr{Province:"Hunan",City:"ChangSha"}}

js,err:=json.Marshal(xm)

iferr!=nil{

fmt.Println(err)

return

}

fmt.Println(string(js))

varxxmstu

err=json.Unmarshal(js,&xxm)

fmt.Println(xxm)

}

输出:

{"name":"xiaoming","age":18,"addr":{"province":"Hunan","city":"ChangSha"}}//转化的时候会按照我们指定的名字来转

{xiaoming 18 {Hunan ChangSha}}//反过来也是一样

1

2

{"name":"xiaoming","age":18,"addr":{"province":"Hunan","city":"ChangSha"}}//转化的时候会按照我们指定的名字来转

{xiaoming18{HunanChangSha}}//反过来也是一样

nlohmann/json库是C++一个流行的JSON库,它提供了一个简单的接口来序列化和反序列化JSON数据。其,`to_json` 和 `from_json` 是库用于自定义对象与JSON之间转换的函数。 1. `to_json` 函数用于将C++对象转换为JSON对象。 2. `from_json` 函数用于将JSON对象解析回C++对象。 要使用这两个函数,你需要定义它们,以便它们知道如何处理特定的C++类型。下面是一个简单的例子,展示了如何为自定义的结构体定义这些函数: ```cpp #include <nlohmann/json.hpp> // 使用nlohmann的json命名空间 using json = nlohmann::json; // 定义一个结构体 struct MyStruct { int id; std::string name; }; // 自定义to_json函数 void to_json(json& j, const MyStruct& p) { j = json{{"id", p.id}, {"name", p.name}}; } // 自定义from_json函数 void from_json(const json& j, MyStruct& p) { j.at("id").get_to(p.id); j.at("name").get_to(p.name); } // 示例使用 int main() { // 将结构体转换为JSON MyStruct myStruct = {1, "example"}; json j = myStruct; // 输出结果 std::cout << j.dump(4) << std::endl; // 从JSON反序列化结构体 json j2 = R"({"id": 2, "name": "another"})"_json; MyStruct myStruct2; j2.get_to(myStruct2); // 输出结果 std::cout << "id: " << myStruct2.id << ", name: " << myStruct2.name << std::endl; return 0; } ``` 在上面的代码,`to_json` 函数接受一个JSON对象的引用和一个常量结构体引用,然后将结构体的内容填充到JSON对象。`from_json` 函数接受一个JSON对象的常量引用和一个结构体的非常量引用,然后将JSON对象的数据填充到结构体。 注意,`from_json` 函数使用了`get_to`方法,它尝试从JSON获取值并将其存储到提供的对象。如果JSON没有相应的键,或者类型不匹配,这将会抛出一个异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值