0

这是代码示例:

func GetValue(c echo.Context) error {
    //other implementation details
    
    value, err := service.GetValue()
    if err != nil {
        return c.JSON(http.StatusBadRequest, errorresponse.Error(4003, err))
    }

    //if I set same value here, it works as expected
    //value.Value = []int8{48, 48, 48, 54, 54, 49, 56, 54, 32, 32, 32, 32, 32, 32, 32}

    return c.JSON(http.StatusOK, value)
}
 
//this is type service.GetValue() returns
type ValueGetResponse struct {
    Value     interface{}
    ValueType string
}

如果我使用来自service.GetValue()方法的值,API 会给出如下响应。它将它转换为某种我不知道的字符串。当我检查value.Value属性时,reflect.TypeOf(value.Value)说它是[]int8as 类型。VSCode 调试器也批准它。

请求中使用的对象:

在此处输入图像描述

响应:

{
    "Value": "MDAwNjYxODYgICAgICAg",
    "ValueType": "[]uint8"
}

如果我手动设置期望值,它会按预期工作,我不明白为什么第一个不是。

value.Value = []int8{48, 48, 48, 54, 54, 49, 56, 54, 32, 32, 32, 32, 32, 32, 32}

请求中使用的对象:

在此处输入图像描述

响应:

{
    "Value": [
        48,
        48,
        48,
        54,
        54,
        49,
        56,
        54,
        32,
        32,
        32,
        32,
        32,
        32,
        32,
        32
    ],
    "ValueType": "[]uint8"
}
4

1 回答 1

0

在 Golangbyte中是别名uint8,当您使用json.Marshal它时,它会返回[]byte与您的数据相同的类型。因此,当您收到此类数据时,它会被转换为字符串。

您需要将 uint8 转换为其他 int 类型或实现Marshaler interface

投掷

bytes, err := service.GetValue()
value := make([]int8, 0)
for _, v := range bytes {
    value = append(value, int8(v))
}

元帅

type CustomType []uint8

func (u CustomType) MarshalJSON() ([]byte, error) {
    var result string
    if u == nil {
        result = "null"
    } else {
        result = strings.Join(strings.Fields(fmt.Sprintf("%d", u)), ",")
    }
    return []byte(result), nil
}

func GetValue(c echo.Context) error {
    var value CustomType
    bytes, err := service.GetValue()
    value = bytes

    return c.JSON(http.StatusOK, value)
}
于 2021-10-05T13:23:02.617 回答