好好爱自己!

go json 编解码中的双引号问题

什么是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 (字节序)后的差异,看下是哪里的问题,找到原因!!

 

也可以反推: 

1
a.Name = "aaaaaa\"123"这个json.Marshal一下之后,输出的为: {"Name":"aaaaaa\"123"} 这字符串,将里面的双引号转义一下即可:{\"Name\":\"aaaaaa\\\"123\"}

-----------------------------

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
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 字段的大小写问题:

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
33
34
35
36
37
38
39
40
41
42
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)
}

  

 

posted @   立志做一个好的程序员  阅读(3663)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-02-24 【转】JavaScript错误处理和堆栈追踪
2018-02-24 【转】Web Worker javascript多线程编程(一)
2018-02-24 [转]thrift系列 - 快速入门

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示