当我们将空Json解组到golang中的struct时会发生什么?

当我们将空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

我在Golang中将空JSON字符串解析为结构时遇到问题。在操场上,当我运行此代码时,封送函数返回JSON输入的意外结束。但是,当我们将空JSON字符串解析为结构时,这是Golang的正式返回吗

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。然后绕过解组逻辑。