Golang中空JSON切片被转换为"nil"而非"[]"的问题

Golang中空JSON切片被转换为"nil"而非"[]"的问题 具体来说,使用了 trpc-go。 当我发起请求时,输入一个空的 JSON 切片,例如:

{
...
"dataArray": [ ]
}

当我将其转换为如下结构体时:

{
...
dataArray: []*data
}

结构体中的 dataArray 是 “nil”,这与我省略 JSON 中的 “dataArray” 时的情况相同。然而,我希望 “dataArray” 能够被转换成一个长度为 0 的切片,例如:

dataArray := make([]*data, 0)

那么,有没有办法区分 dataArray 的两种输入: 1.

{
...
"dataArray": [ ]
}
{
...
}

非常感谢!


更多关于Golang中空JSON切片被转换为"nil"而非"[]"的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中空JSON切片被转换为"nil"而非"[]"的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中,JSON空切片被解析为nil而非空切片,这是标准库encoding/json的默认行为。要区分显式空数组和缺失字段,可以使用指针指向切片。

以下是解决方案:

package main

import (
    "encoding/json"
    "fmt"
)

type Data struct {
    Value string `json:"value"`
}

type Request struct {
    DataArray *[]*Data `json:"dataArray,omitempty"`
}

func main() {
    // 情况1:显式空数组
    json1 := `{"dataArray": []}`
    var req1 Request
    json.Unmarshal([]byte(json1), &req1)
    
    if req1.DataArray == nil {
        fmt.Println("情况1: dataArray为nil (字段缺失)")
    } else {
        fmt.Printf("情况1: dataArray为显式空数组,长度: %d\n", len(*req1.DataArray))
    }

    // 情况2:字段缺失
    json2 := `{}`
    var req2 Request
    json.Unmarshal([]byte(json2), &req2)
    
    if req2.DataArray == nil {
        fmt.Println("情况2: dataArray为nil (字段缺失)")
    } else {
        fmt.Printf("情况2: dataArray为显式空数组,长度: %d\n", len(*req2.DataArray))
    }
}

输出:

情况1: dataArray为显式空数组,长度: 0
情况2: dataArray为nil (字段缺失)

对于trpc-go,你可以在处理请求时使用相同的模式:

type TRPCRequest struct {
    DataArray *[]*Data `json:"dataArray,omitempty"`
}

func (s *Service) HandleRequest(ctx context.Context, req *TRPCRequest) (*Response, error) {
    var dataSlice []*Data
    
    if req.DataArray != nil {
        // 字段存在(可能是空数组)
        dataSlice = *req.DataArray
    } else {
        // 字段缺失
        dataSlice = nil // 或 make([]*Data, 0) 根据业务需求
    }
    
    // 现在可以区分两种情况
    if req.DataArray == nil {
        fmt.Println("字段缺失")
    } else if len(*req.DataArray) == 0 {
        fmt.Println("字段存在但为空数组")
    }
    
    // 处理逻辑...
}

这种方法通过使用指针包装切片,可以明确区分JSON中字段缺失和字段存在但为空数组的情况。当字段缺失时,指针为nil;当字段存在但为空数组时,指针指向一个长度为0的切片。

回到顶部