gojson编解码中的双引号问题
什么是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"
)
python 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)
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。