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/21825322/why-golang-cannot-generate-json-from-struct-with-front-lowercase-character

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格式数据处理的更多相关文章

  1. jquery ajax调用返回json格式数据处理

    Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({ url: "some.php", async: ...

  2. JS基础语法---JSON格式的数据

         1. 对象: 有属性和方法,特指的某个事物     对象: 一组无序属性的集合的键值对,属性的值可以是任意的类型   2.JSON格式的数据:一般都是成对的,是键值对,     json也是 ...

  3. mysql json格式数据处理

    1.查询字段所对应的值: SELECT c.result_http->"$.create_time",json_extract(c.result_http,"$.e ...

  4. Java入门系列:处理Json格式数据

    本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...

  5. ajax处理返回的三种格式(json格式 , xml通用格式 , html文本格式)(数据类型:整数、字符串、数组、对象)(基础最重要!)

    ajax方法的参数 常用的ajax参数比如url,data,type,包括预期返回类型dataType,发送到服务器的数据的编码类型contentType,成功方法,失败方法,完成方法.除了这些以外还 ...

  6. JSon_零基础_008_将JSon格式的"数组"字符串转换为List集合

    将JSon格式的"数组"字符串转换为List集合. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, ...

  7. JSon_零基础_007_将JSon格式的"数组"字符串转换为Java对象"数组"

    将JSon格式的"数组"字符串转换为Java对象"数组". 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“n ...

  8. JSon_零基础_006_将JSon格式的字符串转换为Java对象

    需求: 将JSon格式的字符串转换为Java对象. 应用此技术从一个json对象字符串格式中得到一个java对应的对象. JSONObject是一个“name.values”集合, 通过get(key ...

  9. JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写:po(bean)代码: package com.west.webcourse.po; /** * 第 ...

随机推荐

  1. setAccessible()方法

    在java代码中,我们经常使用private来控制类中成员变量的访问权限,在类的外边我们一般使用get方法获取私有成员变量的值,但是如果类中没有get方法,但我们又想获取该类私有成员变量的值,该怎么办 ...

  2. Scrapy进阶知识点总结(六)——中间件详解

    概述 查看scrapy官网的框架图,可以看出中间件处于几大主要组件之间,类似于生产流水线上的加工过程,将原料按照不同需求与功能加工成成品 其中4,5处于下载器与引擎之间的就是下载中间件,而spider ...

  3. H5+app -- 关于ajax提交问题

    1.前阵子在做系统的h5+ app为满足手机端也能进行业务操作,例如:提货,扫描入库之类的.所以就要将做接口,从手机端调用后台系统的方法. 2.例如这样的请求格式,但是呢,每次请求它都直接跳到erro ...

  4. 问题:做EsayUI分页报错 $(...).pagination is not a function之后我把<jsp:include page="top.jsp"/>去掉就好了,有大神知道为什么吗?另外分页按键放在那里好些,我放到form表单下,就开始显示,点一下后就没有了

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  5. C++中对封装的语法支持——静态成员

    静态成员(变量与函数) 1.静态成员变量的语法.访问.特点(共享.类内声明类外初始化) 静态成员变量在class中只做声明,并没有初始化所以不会分配内存. (1) 非静态成员变量必须通过对象来访问. ...

  6. 100天搞定机器学习|Day56 随机森林工作原理及调参实战(信用卡欺诈预测)

    本文是对100天搞定机器学习|Day33-34 随机森林的补充 前文对随机森林的概念.工作原理.使用方法做了简单介绍,并提供了分类和回归的实例. 本期我们重点讲一下: 1.集成学习.Bagging和随 ...

  7. Missing radix parameter 错误的解决办法

    下载了Mint-Ui的example,使用npm run dev时发现如下报错: ERROR in ./packages/loadmore/src/loadmore.vue ✘ http://esli ...

  8. 使用OpenMP加快OpenCV图像处理性能 | speed up opencv image processing with openmp

    本文首发于个人博客https://kezunlin.me/post/7a6ba82e/,欢迎阅读! speed up opencv image processing with openmp Serie ...

  9. vscode在终端运行脚本时出现“因为在此系统上禁止运行脚本”

    首先关闭vscode,再以管理员的身份运行vscode,然后打开终端执行: get-ExecutionPolicy,显示的是Restricted,表示状态是禁止的; 再执行:set-Execution ...

  10. 【绝对有收获】看看?必须告诉你为什么要使用MQ消息中间件(图解版)

    欢迎关注文章系列 ,关注我 <提升能力,涨薪可待> <面试知识,工作可待> <实战演练,拒绝996> 也欢迎关注微信公众号[Ccww笔记],原创技术文章第一时间推出 ...