相关文章推荐
谈吐大方的跑步鞋  ·  Errno 9: Bad file ...·  1 年前    · 
深沉的黄豆  ·  shell读取csv跳过首行 - ...·  1 年前    · 
温文尔雅的镜子  ·  海康威视MVS ...·  2 年前    · 

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

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

"number" : 3 , "message" : "success" , "people" : [ { "craft" : "ISS" , "name" : "Chris Cassidy" } , { "craft" : "ISS" , "name" : "Anatoly Ivanishin" } , { "craft" : "ISS" , "name" : "Ivan Vagner"

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

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解析失败示例与原因

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

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

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

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

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

HTTP允许Web服务器和浏览器通过网络发送并接收数据,是一种基于“request-response”,Http使用可靠的TCP连接,当前最新版本是HTTP/1.1,定义域RFC2616中,下载地址:首先介绍一下请求和响应的基本格式HTTP请求信息HTTP请求一般包含三个部分,从上到下依次是:1、第一行:请求方法URI 协议/版本(例:GET /index.jsp HTTP/1.1)2、几行he... 关于response 在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息,与 HTTP 请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文 代码解析 Response 结构体 Response表示来自HTTP请求响应。 一旦收到响应头,客户机和传输将从服务器返回响应响应主体在读取主体字段时按需流式传输 type Response struct { Status string // e.g. "200 OK" StatusCode int // 最近在做一个项目(使用的beego框架),其中的一个接口有返回FS(分布式文件系统)的一个文件地址URL,其中含有一个&符号,但是通过beego返回的response中发现将其转义为了 “\u0026”,其原因是因为 beego 在对返回值进行 json.marshal 时会自动对特殊字符进行转义。 godoc文档,解释如下: String values encode as JSON strings coerced to valid UTF-8, replacing invalid by. 最近在写golang的聊天室,发现个问题,也就是解析前端传过来的json字符串的时候该怎么解析,下面为个人简要笔记。 服务端接收客户端请求的json字符串 请求json字符串解析也很简单,主要是调用json包中的NewDecoder方法去做解析,可以直接解析http请求的body。 func main() { // 监听请求 http.HandleFunc("/test",getJs... type ConfigStruct struct { Host string `json:"host"` Port int `json:"port"` AnalyticsFil 在接受到一个请求后,服务器会返回一个HTTP响应HTTP响应由三部分构成,即状态行,相应报头和响应正文。         1、状态行         状态行由HTTP版本(HTTP-Version)、状态码(Status-Code)以及解释状态码的简单短语(Reason-phrase)三部分构成,请格式如下:         HTTP-Version Status-Code Reason- 用JSONUtil.toJsonStr()把Bean转成Json字符串后,再用JSONUtil.toBean()把带时间戳的json字符串转换成Bean时,如果时间戳小于等于2147483647(即Integer最大值),转换就会出错 一次http传输,是由请求报文和响应报文来完成的 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 HTTP是一个属于应用层的面向对... 用户通过 HTTP 访问一台正在运行Internet信息服务的服务器上的内容时,会返回一个表示该请求的状态的数字代码。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。 1** - 信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1**响应。 · 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(H "sync": false, "server": ["rsync1.vclound.com", "rsync2.vclound.com", "rsync3.vclound.com"], "source": "0.0.0.0" golang 代码如下 package main import ( "fmt" 在 Go 中 Http 请求的返回结果为 *http.Response 类型,Response.Body 类型为 io.Reader,把请求结果转化为Map需要进行一些处理。 写一个公共方法来进行Response转Map处理: package util import ( "encoding/json" "net/http" "io/ioutil" func Pars...