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

摘要:
现在,越来越多的项目和开发插件将默认支持并使用json数据格式作为数据保留和传输的方式。然而,由于json是一种JavaScript对象表示,它自然很好地支持js,因此许多ajax应用程序现在都使用json,这将得到更好的处理。w3c的标准描述如下:JSON是一种轻量级数据交换格式。它基于JavaScript编程语言,是标准ECMA-2623版(1999年12月)的一个子集。

什么是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)
}

  

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

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

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)
}

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

免责声明:文章转载自《go json 编解码中的双引号问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java设计模式学习记录-状态模式easyUI使用dailog实现弹出框带表单功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

应急溯源SSH日志查看小技巧

正常登陆 Linux 以下几个位置记录相关日志: SSH登录操作相关的日志有以下几个位置: /var/log/btmp,记录错误的登录尝试,查询命令:lastb /var/log/auth.log,记录认证成功的用户 /var/log/secure,记录与安全相关的日志信息 /var/log/lastlog,记录用户上次登录信息 /var/log/w...

最长有效括号

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 小编的这道题用的暴力法,之后发现自己太水了,之后看了LeetCode的官方题解链接:https...

ROS(Robot Operating System)常用环境变量介绍

本文简单介绍ROS系统中常用的环境变量用途及设置方式。ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等。 http://wiki.ros.org/ROS/EnvironmentVariables 一 、必选设置的环境变量 1、 ROS_ROOT 这个是ROS核心...

Mysql:windows上mysql服务管理

自5.1.21及以后的变化: The following table shows the available servers for Windows in MySQL 5.1.20 and earlier. Binary Description mysqld-nt Optimized binary with named-pipe sup...

C#使用Log4Net记录日志

当你在开发程序的时候, 调试(debugging)和日志(logging)都是非常重要的工作。在应用中使用日志主要有三个目的 l  监视代码中的变量的变化情况,把数据周期性地记录到文件中供其它应用进行统计分析工作 l  跟踪代码运行的轨迹,作为日后审计的依据 l  担当集成开发环境中的调试器,向文件或者控制台打印代码的调试信息 而实现这些应用的常规方式是在...

Haproxy 开启日志记录

安装部署完Haproxy之后,默认是没有开启日志记录的,需要相应的手工配置使其日志功能开启。 【创建日志记录文件夹】 mkdir /var/log/haproxychmod a+x /var/log/haproxy 【开启rsyslog记录haproxy日志功能】 vim /etc/rsyslog.conf 修改: # Provides U...