Golang:JSON:如何将字符串数组解组为 []int64

2024-01-27

Golang encoding/json包让你使用,string结构标记以便编组/解组字符串值(例如"309230") into int64场地。例子:

Int64String int64 `json:",string"`

但是,这不适用于切片,即。[]int64:

Int64Slice []int64 `json:",string"` // Doesn't work.

有没有办法将 JSON 字符串数组编组/解组到 []int64 字段中?


引用自https://golang.org/pkg/encoding/json https://golang.org/pkg/encoding/json:

“string”选项表示字段以 JSON 形式存储在 JSON 编码的字符串中。它仅适用于字符串、浮点、整数或布尔类型的字段。与 JavaScript 程序通信时有时会使用这种额外的编码级别:


正如你引用的json.Marshal() https://golang.org/pkg/encoding/json/#Marshal, the ,string选项仅适用于特定类型,即:

“string”选项表示字段以 JSON 形式存储在 JSON 编码的字符串中。它仅适用于字符串、浮点、整数或布尔类型的字段。

您希望它与切片一起使用,但这不受json包裹。

如果您仍然需要此功能,则必须编写自定义封送/解封逻辑。

您提出的内容有效,但过于复杂。这是因为您在切片上创建了自定义逻辑,但您只希望在切片(数组)的各个元素上使用此功能。您不想更改数组/切片(作为元素序列)的呈现或解析方式。

因此,一个更简单的解决方案是仅创建一个产生此行为的自定义“数字”类型,并且此自定义类型的切片元素将表现相同。

我们的自定义数字类型和编组/解组逻辑:

type Int64Str int64

func (i Int64Str) MarshalJSON() ([]byte, error) {
    return json.Marshal(strconv.FormatInt(int64(i), 10))
}

func (i *Int64Str) UnmarshalJSON(b []byte) error {
    // Try string first
    var s string
    if err := json.Unmarshal(b, &s); err == nil {
        value, err := strconv.ParseInt(s, 10, 64)
        if err != nil {
            return err
        }
        *i = Int64Str(value)
        return nil
    }

    // Fallback to number
    return json.Unmarshal(b, (*int64)(i))
}

就这样!

使用它的类型:

type Foo struct {
    Bars []Int64Str `json:"bars"`
}

以与您相同的方式进行测试会产生相同的结果。尝试一下去游乐场 https://play.golang.org/p/DuzIqx6JHJ2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang:JSON:如何将字符串数组解组为 []int64 的相关文章

随机推荐

  • 使用 jQuery 检查加载时是否已选中复选框

    我目前正在使用 some box click function main box toggle 效果很好 除非复选框是保存复选框状态的页面的一部分 如果将复选框保存为选中状态 则主框 单击该复选框时会显示 在重新加载时隐藏 并且仅在单击该复
  • AngularJS $http 拦截器

    JavaScript 代码 commonApp angular module commonApp config function httpProvider httpProvider interceptors push myHttpInter
  • 导航抽屉组标题 - 如何设置?

    我有一个菜单 其中包含如下所示的组 是否可以为每个组设置标题 我知道这对于子菜单是可能的 但是第一级组呢 menu menu
  • 在redis服务器上设置spring会话

    我正在使用 Spring Boot 编写我的其余 api 我正在尝试维护 redis 服务器上的用户会话 Redis 已启动并在默认端口上运行6379 我使用生菜罐连接到 redis 服务器 但似乎我的会话没有在 Redis 服务器上设置
  • Pandas 对两个数字之间的列的操作

    目前使用 Pandas 和 Numpy 我有一个名为 df 的数据框 假设我有以下数据 如何根据 Between 子句为第三列提供一个值 我想将其视为矢量化方法如果可能的话 保持我已有的速度 我尝试过 lambda 函数 但坦率地说 我不明
  • 如何获取 PHP 数组中的最后 n 个项目作为另一个数组?

    如何在 PHP 中获取另一个数组的最后 n 个项目的数组 n等于您想要结束的项目数 arr array slice old arr n
  • 如何预加载 Activity?

    我到处寻找这个问题 但似乎没有人有答案 我的简单问题是 有没有办法预加载活动 我需要这个 因为我使用一个选项卡 并且一个选项卡有多个活动 我的活动之一是 RSS 阅读器 它加载非常困难 大约 2 3 秒 我在网上找到的都是一个笑话 每个人都
  • 与单个表的多个 toMan 关系

    我是新来的greenDAO http greendao orm com 我正在编写 DaoGenerator 我遇到的一个问题是我有一个用户表和一个墙柱表 我希望能够在 wallpost 表中有两列 它们与用户表 墙所有者和发帖用户 有 t
  • 执行大型 SQL 脚本(使用 GO 命令)

    我需要从 C 程序中执行大量 SQL 语句 创建一堆表 视图和存储过程 这些语句需要用分隔符分隔GO陈述 但是SqlCommand ExecuteNonQuery 不喜欢GO声明 我的解决方案 我想我会发布以供参考 是将 SQL 字符串拆分
  • 在 R 中转换为带有冒号和逗号的数字字符串[重复]

    这个问题在这里已经有答案了 请帮忙看一下下面的例子 a lt 1 4 20 25 30 40 我需要转换a到一个数字向量 就好像我没有引号一样a 我的意思是 gt c 1 4 20 25 30 40 1 1 2 3 4 20 21 22 2
  • Outlook 规则运行 VBA 脚本将电子邮件正文传递给外部程序

    我设置了一个过滤电子邮件的 Outlook 规则 我想运行一个外部程序 python 脚本 来解析每封这样的电子邮件 我知道 SHELL 函数 但我需要一种方法将电子邮件正文传递给我的外部程序 Google 是你的朋友 我通过搜索 outl
  • 如何在 R 中将多行合并为一个观察

    我对 R 比较陌生 我有点沉迷于尝试将我的数据转换成合适的格式 看起来重塑包可能对此有用 但我没有得到更多 我有一个数据框 其中一列 V4 包含字符串和数字 我想按 V2 和 V1 中给出的分组拆分 V4 并将结果作为三个单独的列附加到数据
  • 将变量从 Express 传递到客户端 JavaScript

    最终 我尝试从 Node 服务器传递 JSON 数据 以供客户端中的 D3 使用 这是我的index js var express require express var router express Router var portmix
  • React-Intl 如何从变量切换语言环境和消息

    我正在尝试弄清楚如何使用 React Intl 更改语言 这是我的第一个 React 应用程序 它是用 create react app 制作的 我没有使用 Redux 或 Flux 在我的 index js 中 我有以下代码 import
  • ggplot2,使用主题后轴不显示(axis.line=element_line())

    我正在尝试使用以下方法绘制下图ggplot2包 但不知何故轴不会显示 刻度线在那里 只是不在轴线上 我已经用过theme axis line element line 功能 但它不起作用 这是我的代码 library ggplot2 ggp
  • 如何从Raspberry Pi Zero发送实时传感器数据到PC?

    我写了一个Python3脚本 运行在树莓派零W从 IMU 传感器 MPU9250 收集数据并创建 3 个不同的角度值 滚动 俯仰 偏航 看起来像这样 def main while True dataAcc mpu readAccelerom
  • 在 Windows 中传输大文件的最佳方法

    在备份我们的网络电子邮件服务器期间 我经常需要在内部和外部驱动器之间传输 gt 50GB 有时 gt 100GB 的大文件 传输这些文件的最佳方法是什么 命令行 例如 XCOPY 如果由于时间限制或网络问题而中断 可能有足够强大的功能可以继
  • Jersey - 为资源方法注册 ExceptionMapper

    问题特定类的异常处理 映射 https stackoverflow com questions 36370991让我想到了如何注册的问题ExceptionMapper到特定资源Method 我尝试过使用DynamicFeature像这样 动
  • 对 node.js、connect-mongo 的并行请求、会话被覆盖

    在当前的项目 一种商店系统 中 我使用node js快递JS and 连接 mongo作为会话存储 在客户端 我在启动时使用单个请求来创建一个新会话 然后向 Node js 服务器发送多个并行请求 当然 因为这些并行请求会更改会话 所以这些
  • Golang:JSON:如何将字符串数组解组为 []int64

    Golang encoding json包让你使用 string结构标记以便编组 解组字符串值 例如 309230 into int64场地 例子 Int64String int64 json string 但是 这不适用于切片 即 int