【问题标题】:JSON unmarshal array of signed integers in GoGo中的JSON解组有符号整数数组
【发布时间】:2020-08-05 08:20:06
【问题描述】:

我正在尝试将 JSON 从整数数组解组为 Go 中的字节切片。

问题是我们只能在 JSON 中的数组包含正整数时这样做,因为它将在 Go 中被识别为 uint8。当数组包含负整数时不起作用。

例如:

  • 这个数组可以工作:[1, 2, 3, 4, 5]
  • 此数组不起作用:[-14, 2, 3, 4, 5](-14 为负数)

这是我收到的错误消息

Cannot unmarshal config file; err= json: cannot unmarshal number -14 int to Go struct field <struct_field> of type uint8

有什么方法可以在 Go 中将带有负整数的 JSON 解组数组转换为字节切片?

【问题讨论】:

  • 强制转换为 uint8 时,您希望 -14 的值是多少? []byte == []uint8 注意:未签名 - 尝试将您的类型更改为 []int8
  • 尝试将 -14 分配给 uint8 的变量:var u uint8; u=-14。有些事情是不可能的。只需使用带符号的 int。
  • 如果您想要原始数据,您可以使用json.RawMessage,然后将其转换为[]byte,使用简单的conversion 表达式。
  • 您不能将负数放入无符号整数中,这是不可能的。除非你自己写编译器
  • @kofoworola 即使您确实编写了自己的编译器。 uint 表示 无符号 整数。如果它可以容纳负值,则它不是无符号整数。

标签: arrays json go struct slice


【解决方案1】:

有什么方法可以在 Go 中将带有负整数的 JSON 解组数组转换为字节切片?

不,因为negative numbers are outside of the valid range of byte values,就像任何大于 255 的数字一样。

【讨论】:

    【解决方案2】:

    谢谢大家的回答。

    我找到了解决方案:由于我想要一个字节数组并且字节不能保存有符号的int,我可以做的是先在离线的JSON输入中将有符号的int转换为无符号,然后我可以用新的无符号进行JSON解组数组。

    游乐场链接:https://play.golang.org/p/Th2DC9AGeEs

    参考代码:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        arr := []int8{-14,1,2,3,4}
        var bytes []byte
        for _, val := range arr {
            bytes = append(bytes, convertToByte(val))
        }
        fmt.Println(bytes) // will print [242 1 2 3 4]
    }
    
    func convertToByte(value int8) byte {
        return byte(value)
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2016-12-16
      • 2020-10-07
      • 2023-01-07
      • 2021-04-03
      相关资源
      最近更新 更多