当我们将空Json解组到golang中的struct时会发生什么?
我在Golang中将空JSON字符串解析为结构时遇到问题。在操场上,当我运行此代码时,封送函数返回JSON输入的意外结束。但是,当我们将空JSON字符串解析为结构时,这是Golang的正式返回吗当我们将空Json解组到golang中的struct时会发生什么?,json,go,Json,Go,我在Golang中将空JSON字符串解析为结构时遇到问题。在操场上,当我运行此代码时,封送函数返回JSON输入的意外结束。但是,当我们将空JSON字符串解析为结构时,这是Golang的正式返回吗 package main import ( "encoding/json" "fmt" ) var respBytes = []byte{} type ResultStruct struct { result []map[string]string } func main
package main
import (
"encoding/json"
"fmt"
)
var respBytes = []byte{}
type ResultStruct struct {
result []map[string]string
}
func main() {
var jsonData ResultStruct
err := json.Unmarshal(respBytes, &jsonData)
fmt.Println(err)
}
对于此行:
var respBytes=[]字节{}
您已经创建了一个空字节片。哪个json.Unmarshal
将无法正确解析它。因为Empty不是有效的JSON字符串
以下是如何解组“空”JSON字符串:
var respBytes = []byte(`{}`)
对于此行:
var respBytes=[]字节{}
您已经创建了一个空字节片。哪个json.Unmarshal
将无法正确解析它。因为Empty不是有效的JSON字符串
以下是如何解组“空”JSON字符串:
var respBytes = []byte(`{}`)
您应该使用
var respBytes=[]字节(``)
或var respBytes=[]字节(`{}')
现在您的问题是,如果我们将空json解封送到struct中,那么它将跳过它
以下代码仅将jsonData ResultStruct保留为init值:
var jsonData ResultStruct
err := json.Unmarshal([]byte(`{}`), &jsonData)
fmt.Println(err)
fmt.Println(jsonData)
现在,仅使用默认初始化,它也将打印相同的内容:
var jsonData ResultStruct
fmt.Println(jsonData)
检查解组是否成功(或有意义)的唯一方法是使用指针类型。默认情况下(或初始化时),指针为nil。如果数据在它们中被正确地解组,那么它们将指向正确的值,否则它们将保持为零。如果jsonData.Result==nil{},您可以利用这一点对指针使用nil-check,比如
package main
import (
"encoding/json"
"fmt"
)
type ResultStruct struct {
Result *[]map[string]string `json:"result"`
}
func main() {
//case 1
var jsonData1 ResultStruct
err := json.Unmarshal([]byte(`{"result":[{"Name":"ADF","Job":"ENG"},{"Name":"ASK","Job":"TEST"}]}`), &jsonData1)
fmt.Println(err)
fmt.Println(jsonData1.Result)
fmt.Println()
//case 2
var jsonData2 ResultStruct
err = json.Unmarshal([]byte(`{}`), &jsonData1)
fmt.Println(err)
fmt.Println(jsonData2.Result)
}
在上面的案例2中,我们可以检查jsonData2.Result是否为nil。如果为nil,则表示解组未能成功检索结果您应该使用var respBytes=[]字节(``)
或var respBytes=[]字节(`{})
现在您的问题是,如果我们将空json解封送到struct中,那么它将跳过它
以下代码仅将jsonData ResultStruct保留为init值:
var jsonData ResultStruct
err := json.Unmarshal([]byte(`{}`), &jsonData)
fmt.Println(err)
fmt.Println(jsonData)
现在,仅使用默认初始化,它也将打印相同的内容:
var jsonData ResultStruct
fmt.Println(jsonData)
检查解组是否成功(或有意义)的唯一方法是使用指针类型。默认情况下(或初始化时),指针为nil。如果数据在它们中被正确地解组,那么它们将指向正确的值,否则它们将保持为零。如果jsonData.Result==nil{}
,您可以利用这一点对指针使用nil-check,比如
package main
import (
"encoding/json"
"fmt"
)
type ResultStruct struct {
Result *[]map[string]string `json:"result"`
}
func main() {
//case 1
var jsonData1 ResultStruct
err := json.Unmarshal([]byte(`{"result":[{"Name":"ADF","Job":"ENG"},{"Name":"ASK","Job":"TEST"}]}`), &jsonData1)
fmt.Println(err)
fmt.Println(jsonData1.Result)
fmt.Println()
//case 2
var jsonData2 ResultStruct
err = json.Unmarshal([]byte(`{}`), &jsonData1)
fmt.Println(err)
fmt.Println(jsonData2.Result)
}
在上面的案例2中,我们可以检查jsonData2.Result是否为nil。如果为nil,则表示Unmarshal未能成功检索结果空字符串不是有效的JSON,也不是包含所有空格的字符串。如果您需要处理空字符串或所有空白字符串,请在调用Unmarshal之前检查这些条件。您询问发生了什么,但随后告诉我们发生了什么。你真正的问题是什么?我不确定这是Go中Json解组的官方方式还是一种特殊情况。空字符串不是有效的Json,也不是包含所有空格的字符串。如果您需要处理空字符串或所有空白字符串,请在调用Unmarshal之前检查这些条件。您询问发生了什么,但随后告诉我们发生了什么。你的实际问题是什么?我不确定这是Go中Json解组的官方方式还是一种特殊情况。如果Json是404或500请求的响应。如果这个JSON被用作RESTful API响应,那么解析JSON时的错误是什么呢。您可能不希望以这种方式实现。通常,我们使用带有JSON标记的struct
,这些标记为解组函数提供信息。为了方便起见,您可以通过更改标记来控制字段行为。请看一看,实际上,我使用的是一个我无法控制的服务器的响应。有时服务器返回404或500。因此,我希望确保响应为空字符串,并且解组将返回而不是nil
错误。所有错误代码都应作为错误处理。不过,如果您只是想检查解组是否跳过了解组,请使用指针。如果解组器未执行任何操作,指针将保持为零。我已经发布了详细信息,我知道你的意思。在这种情况下,您可以手动检查响应主体,以确定主体内容是否为空。比如404和500。然后绕过解组逻辑。如果JSON是404或500请求的响应。如果这个JSON被用作RESTful API响应,那么解析JSON时的错误是什么呢。您可能不希望以这种方式实现。通常,我们使用带有JSON标记的struct
,这些标记为解组函数提供信息。为了方便起见,您可以通过更改标记来控制字段行为。请看一看,实际上,我使用的是一个我无法控制的服务器的响应。有时服务器返回404或500。因此,我希望确保响应为空字符串,并且解组将返回而不是nil
错误。所有错误代码都应作为错误处理。不过,如果您只是想检查解组是否跳过了解组,请使用指针。如果解组器未执行任何操作,指针将保持为零。我已经发布了详细信息,我知道你的意思。在这种情况下,您可以手动检查响应主体,以确定主体内容是否为空。比如404和500。然后绕过解组逻辑。