• [go学习笔记.第十二章.文件操作] 2.json基本介绍


    1.概述

    JSON ( Javascript object Notation)是一种轻量级的数据交换格式 ,易于人阅读和编写 ,同时也易于机器解析和生成.

    JSON 是在 2001 年开始推广使用的数据格式,目前已经成为主流的数据格式.

    JSON易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据 (结构体、 map 等) 序列化成json字符串,到接收方得到 json 字符串时,再反序列化恢复成原来的数据类型(结构体,map 等).这种方式已然成为各个语言的标准

    2.数据格式说明

     在 JS 语言中,一切都是对象。因此,任何的数据类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组, map,结构体等.

    JSON 键值对是用来保存数据一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值:

    [{ "key1" : val1 , " key2 " : vaI2 , "key3" : vaI3 , "key4" :[vaI4 , vaI5]},

    { "key1" : val1 , " key2 " : vaI2 , "key3" : vaI3 , "key4" :[vaI4 , vaI5]},...]

    比如:

    { " firstName " : "Json " }

    比如:

    { "name" : " tom " , " age " : 15 , "address " : [”北京” , "上海” ] }

    比如:

    {[" name " : " tom " , "age" : 18 , "address" :["北京” ,"上海"] }

    3.数据在线解析

    https://www.json.cn网站可以验证一个json格式的数据是否正确,尤其是在我们编写比较复杂的 json 格式数据时,很有用

    4.json的序列化

    介绍:

            json 序列化是指,将有key-value结构的数据类型(比如结构体、 map 、切片)序列化成 json 字符串的操作

    应用案例:

            这里介绍一下结构体、 map 和切片的序列化,其它数据类型的序列化类似

    注意事项:

            对于结构体的序列化,如果我们希望序列化后的 key 的名字,由我们自己重新制定,那么可以给struct指定一个tag标签

    1. package main
    2. import (
    3. "fmt"
    4. "encoding/json"
    5. )
    6. //定义一个结构体
    7. type Monster struct {
    8. Name string `json:"monster_name"` //反射机制
    9. Age int `json:"monster_age"`
    10. Birthday string
    11. Sal float64
    12. Skill string
    13. }
    14. func testMonster () {
    15. monster := Monster{
    16. Name : "猴子",
    17. Age: 12,
    18. Birthday : "2022-12",
    19. Sal : 12.11,
    20. Skill : "棍子武功",
    21. }
    22. //将moster序列化
    23. data, err := json.Marshal(&monster)
    24. if err != nil {
    25. fmt.Printf("序列化失败, er= %v\n", err)
    26. }
    27. //输出序列化后的结果
    28. //
    29. //序列化后的结果为{"monster_name":"猴子","monster_age":12,"Birthday":"2022-12","Sal":12.11,"Skill":"棍子武功"}
    30. fmt.Printf("序列化后的结果为%v\n", string(data))
    31. }
    32. func main() {
    33. testMonster()
    34. }

    5.json的反序列化

    介绍:

            反序列化是指,将 json 字符串反序列化成对应的数据类型(比如结构体、 map、切片)的操作

    应用案例:

            这里介绍一下将 json 字符串反序列化成结构体、 map 和切片

    1. package main
    2. import (
    3. "fmt"
    4. "encoding/json"
    5. )
    6. //定义一个结构体
    7. type Monster struct {
    8. Name string
    9. Age int
    10. Birthday string
    11. Sal float64
    12. Skill string
    13. }
    14. //将json字符串,反序列化成结构体
    15. func unmarshalStruct() {
    16. //str在项目中是通过网络传输获取的,或者读取文件获取的
    17. str := "{\"Name\":\"猴子\",\"Age\":12,\"Birthday\":\"2022-12\",\"Sal\":12.11,\"Skill\":\"棍子武功\"}"
    18. //定义一个monster实例
    19. var monster Monster
    20. err := json.Unmarshal([]byte(str), &monster)
    21. if err != nil {
    22. fmt.Printf("反序列化失败,err=%v\n", err)
    23. }
    24. //反序列化结果={猴子 12 2022-12 12.11 棍子武功}, monster.Name=猴子
    25. fmt.Printf("反序列化结果=%v, monster.Name=%v\n", monster, monster.Name)
    26. }
    27. //将json字符串,反序列化成map
    28. func unmarshalMap() {
    29. //str在项目中是通过网络传输获取的,或者读取文件获取的
    30. str := "{\"age\":13,\"name\":\"张三\"}"
    31. //定义一个map
    32. var map1 map[string]interface{}
    33. //注意:反序列化时,不需要make,因为make操作被封装到Unmarshal函数里面了
    34. err := json.Unmarshal([]byte(str), &map1)
    35. if err != nil {
    36. fmt.Printf("反序列化失败,err=%v\n", err)
    37. }
    38. //反序列化结果=map[age:13 name:张三]
    39. fmt.Printf("反序列化结果=%v", map1)
    40. }
    41. //将json字符串,反序列化成slice
    42. func unmarshalSlice() {
    43. //str在项目中是通过网络传输获取的,或者读取文件获取的
    44. str := "[{\"address\":\"四川\",\"age\":14,\"name\":\"张三\"}," +
    45. "{\"address\":[\"重庆\",\"北京\"],\"age\":33,\"name\":\"李四\"}]"
    46. //定义一个slice
    47. var slice []map[string]interface{}
    48. //注意:反序列化时,不需要make,因为make操作被封装到Unmarshal函数里面了
    49. err := json.Unmarshal([]byte(str), &slice)
    50. if err != nil {
    51. fmt.Printf("反序列化失败,err=%v\n", err)
    52. }
    53. //反序列化结果=map[age:13 name:张三]反序列化slice结果=[map[address:四川 age:14 name:张三] map[address:[重庆 北京] age:33 name:李四]]
    54. fmt.Printf("反序列化slice结果=%v", slice)
    55. }
    56. func main() {
    57. unmarshalStruct()
    58. unmarshalMap()
    59. unmarshalSlice()
    60. }
    对上面代码的小结说明:
    1).在反序冽化一个 json 字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致
    2).如果json字符串是通过程序获取到的,则不需要再对 " 转义处理

    [上一节][go学习笔记.第十二章.文件操作] 1.文件的基本介绍以及基本操作 

    [下一节][go学习笔记.第十三章.单元测试] 1.单元测试 

  • 相关阅读:
    程序员各阶段应该掌握的技术与能力
    CNN 卷积神经网络day3
    一文解读ISO26262安全标准:概念阶段
    ⑩③【MySQL】详解SQL优化
    git如何将master分支合并到自己创建的分支
    脑皮质算法(3)-- 新皮层的位置:利用皮层网格细胞的感觉运动物体识别理论
    常见特征工程操作
    搜维尔科技:使用Touch 触觉力反馈设备,用户可以完全沉浸在培训模拟、神经康复或远程的机器人操控中
    JDK常用内部类
    python自动化运维——模拟键盘鼠标重复性操作Pyautoui
  • 原文地址:https://blog.csdn.net/zhoupenghui168/article/details/127738803