什么是json,json的標准??
現在越來越多的項目和開發插件等默認都會支持和使用json數據格式,作為數據保持、傳輸的一種方式。
說是其中一種,就標示還有好多其他格式。比如:最多是xml。webservice的標准數據格式。
不過由於json是JavaScript 對象表示法(JavaScript Object Notation),天生就對js支持很好,
所以現在很多的ajax等都使用json,反而會更好處理一些。
1、定義
什么是 JSON ?
1.JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
2.JSON 是輕量級的文本數據交換格式
3.JSON 獨立於語言 *
4.JSON 具有自我描述性,更易理解
* JSON 使用 JavaScript 語法來描述數據對象,但是 JSON 仍然獨立於語言和平台。JSON 解析器和 JSON 庫支持許多不同的編程語言。
w3c的標准說明如下:
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數據交換語言。
JSON建構於兩種結構:
1.“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
這些都是常見的數據結構。事實上大部分現代計算機語言都以某種形式支持它們。這使得一種數據格式在同樣基於這些結構的編程語言之間交換成為可能。
JSON具有以下這些形式:
對象是一個無序的“‘名稱/值'對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值' 對”之間使用“,”(逗號)分隔。
其中,屬性的值可以是數組,也可以是一個對象。
數組形式: 數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔
_________________
對比轉換為 [ ]btye (字節序)后的差異,看下是哪里的問題,找到原因!!
也可以反推:
a.Name = "aaaaaa\"123"
這個json.Marshal一下之后,輸出的為: {"Name":"aaaaaa\"123"} 這字符串,將里面的雙引號轉義一下即可:{\"Name\":\"aaaaaa\\\"123\"}
-----------------------------
package main
import (
"log"
"encoding/json"
)
func main() {
type stu struct {
Name string
}
var a stu
a.Name = "aaaaaa\"123"
b, e := json.Marshal(a)
log.Println("---:", b, string(b), e)
//str := "{\"Name\":\"aaaaaa\"123\"}" //要加 \\\" 才可以
str := "{\"Name\":\"aaaaaa\\\"123\"}" //要加 \\\" 才可以
log.Println("---:", []byte(str), str)
var ss stu
_ = json.Unmarshal([]byte(str), &ss)
log.Println("ss:", str)
log.Println("unmar: ",ss)
var asc byte = 'a'
log.Println(asc)
}

-----------------------
GOLANG 雙引號,反引號,單引號使用
1、雙引號里的字符串可以轉義,不能換行
2、反引號里面的內容不能轉義,可以換行,一般用於SQL語句,html等大段內容,以及正則表達式的使用
3、單引號,一般只能用來包裹一個字節的ASCII碼字符,例如:
var asc byte = ‘a’
fmt.Println(asc) //輸出a的ASCII碼值 97
------------------------
golang中json格式有大小寫要求,json中小寫鍵名會無法導出,結構體小寫也無法導出json對應鍵名。
就像這樣(擼代碼):
package main
import(
"fmt"
"encoding/json"
)
type js struct{
name string
}
func main(){
j_:=js{name:"li"}
k,_:=json.Marshal(j_)//已經把j轉化為json流了
fmt.Println(k)//nil
}
but
golang當然有考慮到這一點:
在結構體字段后加標簽可以處理大小寫問題:
package main
import(
"fmt"
"encoding/json"
)
type js struct{
Name string `json:"name"`
}
func main(){
j_:=js{name:"li"}
k,_:=json.Marshal(j_)//已經把j轉化為json流了
fmt.Println(k)//[123 34 110 97 109 101 34 58 34 108 105 34 125]
}
反之,json流轉化為結構體也不用擔心大小寫了。具體原理應該是golang通過反射拿到了tag然后轉換,作為一種golang自身設計與json標准的一種銜接吧。
---------------------------------
golang json marshal unmarshal 字段的大小寫問題:
package main
import (
"log"
"encoding/json"
)
func main() {
type People struct {
Lac string
Lng string `json:"ffs"`
}
type stu struct {
Name string
S []People
}
var a stu
a.Name = "aaaaaa\"123"
var s People
s.Lac = "lac"
s.Lng = "lng"
a.S = append(a.S, s)
b, e := json.Marshal(a)
log.Println("---:", b, string(b), e)
////str := "{\"Name\":\"aaaaaa\"123\"}" //要加 \\\" 才可以
//str := "{\"Name\":\"aaaaaa\\\"123\"}" //要加 \\\" 才可以
str := "{\"Name\":\"aaaaaa\\\"123\",\"S\":[{\"lac\":\"lac123\",\"fFs\":\"lng123\"}]}" // 這里ffs , 和fFs都可以,這里不區分大小寫!
log.Println("---:", []byte(str), str)
var ss stu
_ = json.Unmarshal([]byte(str), &ss)
log.Println("ss:", str)
log.Println("unmar: ",ss)
var asc byte = 'a'
log.Println(asc)
}

