大白话攻略之JSON篇

先看百度百科的定义:

JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

说实话,在第一次看到这段描述的时候,我根本不知道它想表达什么,啥是JSON啊,心里完全没谱。

本质上来说,JSON就是一个字符串,一个字符串,一个字符串!它将变量以字符串的形式进行传递。

先来讲讲在一般情况下,我们怎么传递变量,现在假设我们有三个变量: A=1,B=2,C=3 ,那我们在代码里如何传递这3个变量呢,(你可能会纳闷:这也算是个问题?)

比如:

let A=1
let B=2
let C=3

Function TEST(P1, P2,  P3) {
    Console.log (P1, P2, P2) 
}

TEST(A, B, C) //打印:123

我们直接将A,B,C作为TEST函数的参数传进去完事儿,很简单对吧。

但是,如果代码不是用同一种语言写成的又怎么整?

比如浏览器端(俗称前端)用Javascript语言,服务器用PHP或者Java或者Golang写成,你怎么把Javascript的一个变量直接传递给例如用Golang写的某个函数呢?哈哈,开始挠头了吧。

这时候,JSON登场了,它的初始定义非常简单,就是把各种变量揉在一起变成一个长字符串,

比如A=1, B=2, C=3,JSON将它串在一起变成这样:

“{'a': 1,'b': 2,'c': 3}”

这样,利用传递单一字符串的方式,变相地将3个变量都传递走了,对机器而言,浏览器里运行的Javascript只是向后端的服务器传递了一个字符串,不管你后端运行的软件是什么语言写成,字符串总是可以接收的,因此迂回地解决了前后端变量交换问题。当然,JSON并非只能用在浏览器/服务器,任何没办法直接传递变量又需要进行数据交换的场合,都可以使用JSON。


1. Javascript 使用JSON

  1. 将变量打包成JSON字符串

    在JS下使用JSON超级简单,还是用上面的例子:

        let data = {
            a:1,
            b:2,
            c:3
        }
        let json = JSON.stringify(data)
        console.log(json) //输出 {"a":1,"b":2,"c":3} 这个字符串
    

    然后你通过http也好,ajax也好,把json这个字符串传递到后端服务器即可。

  1. 将JSON字符串还原为变量

    也就是上例的逆操作,可以这样:

            let json = '{"a":1,"b":2,"c":3}' //假设这串字符串是服务器发过来的
            let data = JSON.parse(json)
            console.log(data.a) //输出:1
    
  2. 总结:

    JS对象 转 JSON字符串:用 JSON.stringify (JS对象)

    JSON字符串 转 JS对象:用 JSON.parse (json字符串)


2. Golang使用JSON

  1. JSON字符串转变量:

    方法1:预先创建结构体来保存从JSON字符串解析过来的数据

     import "encoding/json" //首先引用json包
    
     type Data struct {
             A string //注意,在定义结构体的时候,成员首字母一定要是大写,否则json包无法访问
             B string
             C string
     }
    
     var data Data
     strJson :=  `{"a": "1","b": "2", "c":"3"}`
     json.Unmarshal([]byte(strJson), &data) //&符号是取址的意思
     fmt.Printf(data.A) //输出:1
    

    延展阅读:

    Golang中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用,可以简单的理解成,首字母大写是公有的,首字母小写是私有的。

    方法2:不创建结构体直接保存数据

     import "encoding/json"
    
     var data map[string]interface{} 
    
     strJson := `{"a": "1","b": "2", "c":"3"}`
     json.Unmarshal([]byte(strJson), &data)
    
     result := data["a"]
     fmt.Println(result) //输出:1
    

  2. 变量转成JSON字符串

     data := map[string]interface{}{
         "a": "1",
         "b": "2",
         "c": "3",
     }
    
     strJson, _ := json.Marshal(data)
     fmt.Println(string(strJson)) //输出:{"a":"1","b":"2","c":"3"}
    
  3. 总结

    JSON字符串转变量 : 用 json.Unmarshal([]byte(JSON字符串), &变量名)

    变量转成JSON字符串:用JSON字符串, _ := json.Marshal(变量名)


JSON入门内容就讲到这,当然,在真实的环境中,JSON在使用细节上不会这么简单,但请记住它的本质,无非是利用字符串方式解决各种平台之间的数据交换的问题,不用将它想得过于复杂。

你可能感兴趣的:(大白话攻略之JSON篇)