go基础之json格式数据处理
go基础之json格式数据处理
go标准库里面提供了一个包进行go格式的数据处理,官方文档地址:https://golang.org/pkg/encoding/json/ 具体文档大家可以自己去看,这里只记录我自己作为一个初学者踩的坑。
1、结构体小写问题导致出错
type studentInfo struct {
subjects []string
name string
id string
}
一开始我的结构定义如上面所示,但是由于go语法的问题,结构字段首字母如果小写的话不能被其他模块使用,只能被该包内使用,即定义该结构所在文件最上面的package ** 定义的包名。这样我在调用json.Marshal()之后返回的是空的json数据,因为结构体不能被json包正确使用。导致出错。所以第一步需要把结构体的首字母改成大写。
参考阅读:
https://www.blang.io/posts/2014-03_golang-exporting/
https://stackoverflow.com/questions/11693865/lowercase-json-key-names-with-json-marshal-in-go
2、struct没有正确加tag
type studentInfo struct {
Subjects []string
Name string
Id string
}
将结构体定义的字段首字母改成大写之后,调用json.Marshal()之后正常返回了,json格式的数据。但是字段名就如定义的字段一样。但是我实际使用的时候需要是全部小写的字母。
3、struct加上tag
type studentInfo struct {
Subjects []string 'json:"subjects"'
Name string 'json:"name"'
Id string 'json:"id"'
}
定义成上面的格式之后,完美解决了我的问题,正确编码了json格式,字段也正确。
下面是简单的示例:
package main
import (
"fmt"
"encoding/json"
"os"
)
func main(){
type StudentInfo struct {
Subjects []string 'json:"subjects"'
Name string 'json:"name"'
Id string 'json:"id"'
}
subjects := []string{fmt.Sprintf("\"192.168.43.127\"")}
student := new(StudentInfo)
student.Name = "zhangsan"
student.Id = "123456"
student.Subjects = subjects
jsonStr, err := json.Marshal(student)
if err != nil{
fmt.Printf("%s", err)
}
fmt.Printf("%+v\n",tunnel)
os.Stdout.Write(jsonStr)
fmt.Printf("\n")
}
更多相关例子请查看:https://golang.org/pkg/encoding/json/#example_Marshal
4、struct tag扩展
官方参考文档链接:https://godoc.org/reflect#StructTag.Get
tag最有用的功能之一是指定字段名称映射。如果您需要进行大量数据转换,它会非常方便。 比如数据库的ORM实现,很多都是使用这个tag特性实现的。tag底层用的方法是reflect实现的。下面是官方给出的示例代码:
type S struct {
F string `species:"gopher" color:"blue"`
}
s := S{}
st := reflect.TypeOf(s)
field := st.Field(0)
fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))
更多拓展阅读:
https://github.com/golang/go/wiki/Well-known-struct-tags
https://sosedoff.com/2016/07/16/golang-struct-tags.html
go基础之json格式数据处理的更多相关文章
- jquery ajax调用返回json格式数据处理
Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async: ...
- JS基础语法---JSON格式的数据
1. 对象: 有属性和方法,特指的某个事物 对象: 一组无序属性的集合的键值对,属性的值可以是任意的类型 2.JSON格式的数据:一般都是成对的,是键值对, json也是 ...
- mysql json格式数据处理
1.查询字段所对应的值: SELECT c.result_http->"$.create_time",json_extract(c.result_http,"$.e ...
- Java入门系列:处理Json格式数据
本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...
- ajax处理返回的三种格式(json格式 , xml通用格式 , html文本格式)(数据类型:整数、字符串、数组、对象)(基础最重要!)
ajax方法的参数 常用的ajax参数比如url,data,type,包括预期返回类型dataType,发送到服务器的数据的编码类型contentType,成功方法,失败方法,完成方法.除了这些以外还 ...
- JSon_零基础_008_将JSon格式的"数组"字符串转换为List集合
将JSon格式的"数组"字符串转换为List集合. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, ...
- JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"
将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...
- JSon_零基础_006_将JSon格式的字符串转换为Java对象
需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...
- JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面
将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写:po(bean)代码: package com.west.webcourse.po; /** * 第 ...
随机推荐
- [网络]HTTP
HTTP HTTP 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本 ...
- nginx跨域解决方案
nginx跨域解决方案Access to Font at 'http://47.104.86.187/yinjiatoupiao2/iconfont/iconfont.woff' from origi ...
- Python面向对象 | 静态方法 staticmethod
静态方法是类中的函数,不需要实例.静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作.可以理解为,静态方法是个独立的.单纯的 ...
- PowerMock学习(一)之PoweMock的入门--模拟新增学生操作
关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...
- Python 面向对象-下篇
面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...
- nyoj 47-过河问题 (贪心)
47-过河问题 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:2 submit:5 题目描述: 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的 ...
- requests保存图片
1.创建07_save_jpg.py文件 import requests #发送请求respone = requests.get("https://www.baidu.com/img/bd_ ...
- Go 多变量赋值时注意事项
说到多变量赋值时,先计算所有相关值,然后再从左到右依次赋值,但是这个规则不适用于python我们来看一例: package main import "fmt" func main( ...
- SecureCRT 多个会话显示在同一窗口
- ZeroC Ice发送大数据
继上文,我们使用ZeroC Ice传递大块数据时,通常有两种做法,一种是一次请求,另一种就是分多次请求(,这种做法在官方文档有例子).选哪一种根据需要而定. 当分多次请求来完成一大块数据,到底选择每次 ...