首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang HTTP请求Json响应解析方法以及解析失败的原因

Golang HTTP请求Json响应解析方法以及解析失败的原因

作者头像
用户1392128
发布于 2024-01-08 09:53:31
发布于 2024-01-08 09:53:31
65900
代码可运行
举报
运行总次数:0
代码可运行

一、Golang HTTP请求Json响应解析方法

在Golang Web编程中,json格式是常见的传输格式,那么json数据要怎么解析呢? 例如下面请求地址 http://api.open-notify.org/astros.json 响应数据如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
	"number": 3,
	"message": "success",
	"people": [{
		"craft": "ISS",
		"name": "Chris Cassidy"
	}, {
		"craft": "ISS",
		"name": "Anatoly Ivanishin"
	}, {
		"craft": "ISS",
		"name": "Ivan Vagner"
	}]
}

下面是一个http请求并解析json数据到结构体里的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

type people struct {
	Number int `json:"number"`
}

func main() {

	url := "http://api.open-notify.org/astros.json"

	spaceClient := http.Client{
		Timeout: time.Second * 2, // Maximum of 2 secs
	}

	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		log.Fatal(err)
	}

	req.Header.Set("User-Agent", "spacecount-tutorial")

	res, getErr := spaceClient.Do(req)
	if getErr != nil {
		log.Fatal(getErr)
	}

	if res.Body != nil {
    	defer res.Body.Close()
	}
	
	body, readErr := ioutil.ReadAll(res.Body)
	if readErr != nil {
		log.Fatal(readErr)
	}

	people1 := people{}
	jsonErr := json.Unmarshal(body, &people1)
	if jsonErr != nil {
		log.Fatal(jsonErr)
	}

	fmt.Println(people1.Number)
}

按照以上的方法可以正确解析数据

二、Golang json解析失败示例与原因

同样是上面的示例,我们把结构体中改变一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type people struct {
	number int `json:"number"`
}

将Number改成了小写字母开头的number,再次执行一下就会发现,无法正常解析了

原因 其实原因很简单,golang首字母大小写意味着改变了成员的访问权限,小写就变成私有的了,不同package是无法访问其他package的私有成员的,导致json.Marshal(其使用了reflect)无法反射到内容。 打个比方,你如果把json.Marshal(hp) 这个方法的重新实现在main方法下面,struct中的成员变量就可以小写了。

注意 struct内的成员变量小写就只有当前包内可以访问。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
golang常用的http请求操作
Golang诞生已经超过十个年头了,发展得愈发完善,其简单方便的协程并发机制使得其在爬虫领域有着一定的天赋。
赵云龙龙
2020/05/22
1.5K0
golang常用的http请求操作
之前用python写各种网络请求的时候写的非常顺手,但是当打算用golang写的时候才发现相对来说还是python的那种方式用的更加顺手,习惯golang的用法之后也就差别不大了,下面主要整理了常用的通过golang发起的GET请求以及POST请求的代码例子
coders
2019/09/29
6.2K0
go 语言实战入门案例之命令行排版词典
先看一下用到的 API ,以彩云科技提供的在线翻译为例。请打开彩云翻译的网页,然后右键检查打开浏览器的开发者工具。
timerring
2023/10/13
2040
go 语言实战入门案例之命令行排版词典
Go语言核心之美 -JSON
JSON(JavaScript Object Notation)是一种发送和接收结构化信息的标准化表示法。类似的标准化协议还有XML、ASN.1、Protobuf、Thrift等等,这些协议都有自己的鲜明特色,但是由于JSON的简洁、可读、流行性,因此它是应用最广泛的协议之一。 Go语言对上述协议的编码和解码都有很好的支持,例如标准库中的encoding/json、encoding/xml、encoding/asn1以及第三方库github.com/golang/protobuf,这些包提供的API接口都
李海彬
2018/03/22
1.5K0
使用 GoLang 获取 TLS 的 Client Hello Info
TLS(Transport Layer Security)是一个保证信息安全的应用层协议。它的前身是 SSL(Secure Socket Layer)。它是一套定义了如何对由 TCP 传输的报文进行加密的协议。
饶文津
2020/07/14
3.5K0
使用 GoLang 获取 TLS 的 Client Hello Info
[Golang]从0到1写一个web服务(上)
学生时代曾和几个朋友做了一个笔记本小应用,当时我的角色是pm + dba,最近心血来潮,想把这个玩意自己实现一遍,顺便写一篇文章记录整个过程。
薯条的编程修养
2022/08/10
7710
[Golang]从0到1写一个web服务(上)
ONLYOFFICE文档转换开发技术
onlyoffice具有文档转换的功能,就是你给一个文档的地址,以及一些参数,post给document server,它会转换成你要的,然后返回一个文件地址,你收到这个地址,把文件下载下来保存,提供用户下载。
hotqin888
2019/08/14
2.3K0
Golang包——net
请求http://localhost:8080/hello会打印hello world
羊羽shine
2019/05/29
4960
学习go语言编程之网络编程
Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可。
编程随笔
2023/10/15
5120
Golang语言HTTP客户端实践
最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在前一段时间学习洼坑中挣扎了好几天,差点就忘记这个重要的成功经验。
FunTester
2021/10/20
1.3K0
Go语言中的JSON处理 【Go语言圣经笔记】
JavaScript对象简谱(JSON, Java Script Object Notation)是一种用于发送和接收结构化信息的标准协议。在类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、可读性和流行程度等原因,JSON是应用最广泛的一个。
Steve Wang
2021/12/06
7100
Golang 语言怎么使用 net/http 标准库开发 http 应用?
在 Golang 语言中,可以使用 net/http 实现 http server,可以通过调用 ListenAndServe 函数,传入给定参数,地址和处理器 (handler)。处理器参数为 nil 时,默认使用 DefaultServeMux。
frank.
2021/06/22
1.2K0
go实现高并发高可用分布式系统:log微服务的实现
在大数据时代,具备高并发,高可用,理解微服务系统设计的人员需求很大,如果你想从事后台开发,在JD的描述中最常见的要求就是有所谓的“高并发”系统开发经验。但我发现在市面上并没有直接针对“高并发”,“高可用”的教程,你搜到的资料往往都是只言片语,要不就是阐述那些令人摸不着头脑的理论。但是技术的掌握必须从实践中来,我找了很久发现很少有指导人动手实践基于微服务的高并发系统开发,因此我希望结合自己的学习和实践经验跟大家分享一下这方面的技术,特别是要强调具体的动手实践来理解和掌握分布式系统设计的理论和技术。
望月从良
2022/01/15
1.1K0
go实现高并发高可用分布式系统:log微服务的实现
Go实战--实现简单的restful api
生命不止,继续 Go go go !!! 今天跟大家介绍一下如何使用go创建一套restful api,我们依托于开源库gorilla/mux。 let’s go~~ 何为RESTful API A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. A RESTful API – also referred to as a RESTf
程序员的酒和故事
2018/03/12
1K0
Go实战--实现简单的restful api
《Go语言入门经典》19~21章读书笔记
Go语言在net/http包中提供了一个快捷方法,可用于发出简单的GET请求。使用这个方法意味着不需要考虑如何配置HTTP客户端以及如何设置请求报头。如果只是要从远程网站获取一些数据,那么默认配置完全够用。
跑马溜溜的球
2020/12/07
1.5K0
使用go构建彩云翻译的Alfred Workflow | 青训营笔记
最近参加了字节跳动的后端专场青训营,是一个免费的Go培训项目,正好最近入职了字节跳动的安全与风控部门,负责公司的业务安全(电商SDLC),公司大部分业务以Go为主,借此青训营机会希望也可以提升一下自己的Go后端开发水平,更好的为公司工作。
Y1ng
2022/10/31
8930
使用go构建彩云翻译的Alfred Workflow | 青训营笔记
Go HTTP
在网络编程里多数情况下,我们都在处理HTTP请求,关于请求协议的部分我推荐阅读《TCP协议》这本书,绝对值得购买。Go语言也提供了一个标准库包net/http,让开发者可以快速的处理HTTP请求,其封装的易用性,足够简单。并且,整个net包里提供了多种多样的处理模块,比如rpc等等。http包提供了HTTP客户端和服务端的实现,这让我想到了Node.js提供的http模块。
icepy
2019/06/24
1.5K0
Go HTTP
Let's Go!你输入关键字,我给你b站视频表!
今天主要是来练习一下Go的语法,之前做过Python爬虫,那放到Go里面如何搞呢?
公众号guangcity
2021/07/09
7680
Let's Go!你输入关键字,我给你b站视频表!
[Go基础]Json在Go中的使用
本文主要根据Go语言Json包[1]、官方提供的Json and Go[2]和go-and-json[3]整理的。
TOMOCAT
2020/06/09
9.8K0
HTTP 请求中使用 protobuf 协议数据
最近都在忙第三方广告对接的事情, 在此记录一下, 有些第三方的API文档扔了一个word文档,文档上几十上百个参数, 只有一个表格参数说明, 然后自己根据表格手写参数(真的折磨)
seth-shi
2023/12/18
1.1K0
相关推荐
golang常用的http请求操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档