自定义将结构解组为切片映射

2023-12-07

我以为我现在已经理解了解组,但我想还没有。我在用 Go 解组地图时遇到了一些麻烦。这是我到目前为止的代码

type OHLC_RESS struct {
    Pair map[string][]Candles
    Last int64 `json:"last"`
}

type Candles struct {
    Time   uint64
    Open   string
    High   string
    Low    string
    Close  string
    VWAP   string
    Volume string
    Count  int
}

func (c *Candles) UnmarshalJSON(d []byte) error {
    tmp := []interface{}{&c.Time, &c.Open, &c.High, &c.Low, &c.Close, &c.VWAP, &c.Volume, &c.Count}
    length := len(tmp)
    err := json.Unmarshal(d, &tmp)
    if err != nil {
        return err
    }
    g := len(tmp)
    if g != length {
        return fmt.Errorf("Lengths don't match: %d != %d", g, length)
    }
    return nil
}

func main() {
    response := []byte(`{"XXBTZUSD":[[1616662740,"52591.9","52599.9","52591.8","52599.9","52599.1","0.11091626",5],[1616662740,"52591.9","52599.9","52591.8","52599.9","52599.1","0.11091626",5]],"last":15}`)
    var resp OHLC_RESS
    err := json.Unmarshal(response, &resp)
    fmt.Println("resp: ", resp)
}

运行代码后,last字段将很好地解组,但无论出于何种原因,地图都没有任何价值。有什么帮助吗?


对于特定示例 JSON,权宜之计的解决方案是根本不使用映射,而是更改结构OHLC_RESS使其与 JSON 的结构相匹配,即

type OHLC_RESS struct {
    Pair []Candles `json:"XXBTZUSD"`
    Last int64     `json:"last"`
}

https://go.dev/play/p/Z9PhJt3wX33


然而,我认为,可以安全地假设,您选择使用映射的原因是因为保存“对”的 JSON 对象的键可能会有所不同,因此将它们硬编码到字段的标签中是不可能的。

要理解为什么您的代码不能产生所需的结果,您必须认识到两件事。首先,order结构体的字段有无轴承关于如何解码 JSON 对象的键。二、名称Pair holds 没有特殊意义对于解组器。因此,默认情况下,解组器具有no way知道你的愿望是解码"XXBTZUSD": [ ... ]元素进入Pair map.

因此,为了获得您想要的结果,您可以OHLC_RESS实施json.Unmarshaler界面并执行以下操作:

func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
    // first, decode just the object's keys and leave
    // the values as raw, non-decoded JSON
    var obj map[string]json.RawMessage
    if err := json.Unmarshal(d, &obj); err != nil {
        return err
    }

    // next, look up the "last" element's raw, non-decoded value
    // and, if it is present, then decode it into the Last field
    if last, ok := obj["last"]; ok {
        if err := json.Unmarshal(last, &r.Last); err != nil {
            return err
        }

        // remove the element so it's not in
        // the way when decoding the rest below
        delete(obj, "last")
    }

    // finally, decode the rest of the element values
    // in the object and store them in the Pair field
    r.Pair = make(map[string][]Candles, len(obj))
    for key, val := range obj {
        cc := []Candles{}
        if err := json.Unmarshal(val, &cc); err != nil {
            return err
        }
        r.Pair[key] = cc
    }
    return nil
}

https://go.dev/play/p/Lj8a8Gx9fWH

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

自定义将结构解组为切片映射 的相关文章

  • 从Lua到C的Lua嵌套表

    我不幸未能将嵌套 Lua 表转换为 C json 对象 我正在使用 LuaTableToJson 请参阅后面的代码 其中 index 是要检索的参数索引 PopOneArg 是根据值的类型处理值的例程 当有嵌套表时 我想递归地调用 LuaT
  • 在 React Native 中迭代 JSON

    我在本机反应中遇到了一个问题 我已经解析了一个大型 JSON 对象 并且需要迭代嵌套在其中的数组 我需要做的就是在每个项目对象中打印 day 0 的三个值 我的代码 import React Component PropTypes from
  • pySpark 映射多列

    我需要能够使用多列比较两个数据帧 pySpark尝试 get PrimaryLookupAttributeValue values from reference table in a dictionary to compare them t
  • 将 JSON 数据从 Chrome 浏览器扩展发布到 MVC 控制器

    我编写了一个 Chrome 浏览器扩展 它使用 Ajax 将数据发送到 MVC3 控制器 为了确保控制器代码正常工作 我首先编写了一个 Razor 网页来原型化 ajax 代码 该代码在网页中工作 绑定了所有的 JSON 模型 我将其发布到
  • 使用指针接收器调用函数的 Go 语法

    在Go中 如果我定义一个带有指针的函数作为接收者 它是否应该只允许从指针调用该函数 为什么从值本身调用这个函数就可以 并且有同样的效果 例如 在以下程序中 m1 reset 和 m2 reset 具有相同的效果 即使 m1 是一个值而 m2
  • Android:如何让onTouch像onClick一样工作?

    我用过这个教程http mobiforge com developing story using google maps android http mobiforge com developing story using google ma
  • POST JSON 对象到 aws lambda

    如何通过 aws API 网关将 json 对象发布到 aws lambda 函数 p s 我的目标是用 python 编写 lambda 函数 然后将其发布到 aws SQS 提前致谢 我想到了 现在 我有一个 API 网关接受客户端发布
  • 跟踪已输出哪些 JSON 对象

    我通过将索引设置为 a 来随机输出 20 个左右的 JSON 对象randomNumber 最初是在页面加载时 我正在单独刷新已按 timeInterval 输出的每个 JSON 对象 为了跟踪已输出的 JSON 项目 我将每个项目的索引存
  • “通用”现实世界文档的 JAXB 解组

    我们有一大套该风格的配置文档
  • 如何在flutter中使用API​​调用嵌套的json数据?

    我的 JSON 看起来像这样 Info c type id 1 cleaning type A Cleaning c type id 2 cleaning type B Cleaning c type id 3 cleaning type
  • 将 JSON 数据传递到 Spring MVC 控制器

    我需要将 JSON 字符串发送到 Spring MVC 控制器 但我没有 有任何表单绑定 我只需要将纯 JSON 数据发送到 Controller 类 我正在对 Controller 方法进行 jQuery AJAX 调用 如下面的代码所示
  • 如何使用 Quarkus 记录 com.fasterxml.jackson 错误?

    我使用 Jackson 检查和数据绑定 REST API 的输入 JSON 并且我想在输入与输入不匹配时记录错误 Valid约束 但是 异常会作为Response通过 API 但不会出现在 Quarkus 的日志中 我如何记录 Jackso
  • 如何按范围对列表元素进行分组/计数

    如果我的 x 列表和 y 列表是 x 10 20 30 y 1 2 3 15 22 27 我希望返回值是一个字典 其中包含小于 x 值的元素计数 10 3 20 1 30 2 我有一个非常大的列表 所以我希望有一种更好的方法来做到这一点 不
  • Mysql - 如何比较两个 Json 对象?

    将整个 MySql json 列与 json 对象进行比较的语法是什么 以下不起作用 select count criteria from my alerts where criteria industries 1 locations 1
  • 如何使用 glide golang 安装私有仓库

    我在用glide作为我的 golang 项目的包管理 我无法使用私有存储库glide get bezos gitlab com gomock 即使我提供了正确的凭据 它也会询问用户名和密码 但最终会抛出错误 请提出任何想法 这与glide或
  • 加密json数据

    如何加密从客户端到服务器来回传输的 JSON 数据 当我使用firebug时 我可以看到所有数据 内容在result d 我正在使用 ASP NET 3 5 和 C 我们的管理员已将网站设置为使用 https 但我仍然可以发送 POST 请
  • 如何在Go包之间共享测试接口?

    Go 不会在不同包的测试文件之间共享代码 因此测试接口的定义不会自动重用 在实践中我们如何解决这个问题 使用示例testing quick foo foo go package foo type Thing int const X Thin
  • 将新行 JSON 上传到 Elasticsearch 批量 API

    我正在尝试使用 Bulk API 将新行 JSON 上传到 Elasticsearch 我上传的批量 JSON 如下所示 每个 JSON 都占一个新行 ip x x x x seen true classification maliciou
  • 只返回 $.ajax 传递的 JSON 数据的前 20 个结果?

    我有以下简单的 jquery 片段 document ready function ajax url myjson json dataType json success function json each json function al
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建

随机推荐

  • GGTS (Eclipse) 和 JAVA 1.8 中的 JVM 不兼容

    由于升级到 Java 1 8 在 GGTS eclipse 中运行 grails 应用程序时出现一些问题 堆栈开始于 Mar 05 2015 3 51 31 PM org springsource loaded jvm JVM copyMe
  • 尝试上传大文件时出现异常

    我正在为我的服务使用 wshttpbinding
  • 在 C 中,当 'a' 是 int 时,为什么 sizeof(char) 是 1?

    I tried printf d d n sizeof char sizeof c and got 1 4作为输出 如果字符大小为 1 为什么 c 给我4个 我猜这是因为它是一个整数 所以当我这样做时char ch c 当将 4 字节值分配
  • 在 iOS 中,使用 CFUUID 生成的 id 有多唯一?

    其实标题就是我的问题 既然 Apple 不再允许使用 UUID 我决定使用 CFUUID 不过我对此有一些疑问 每个设备都是唯一的吗 如果是 它与 UUID 有什么不同 它是随机生成器吗 如果是的话有多好 我能确定 10000 台设备中不会
  • 我的 cookie 真的只是 HTTP 吗? Cookie 请求标头中缺少标志

    我做了一些配置 最终 仅在 HTTP 上设置我的 cookie 似乎 有效 我试过了postman我有以下内容 当我点击登录页面时 在 cookies 部分 我的名为 JSESSIONID 的 cookie 似乎只是 HTTP 它有检查 当
  • 使用MySQL,如何选择某一特定行的查询结果排名?

    今天我花了很多时间尝试各种事情 但似乎都不起作用 这是我的情况 我希望能够根据特定排序行中的 ID 选择行的排名 例如 如果我的查询类似于 SELECT id name FROM people ORDER BY name ASC 结果如下
  • Emgu - CalcHist _rowRange 错误

    我正在尝试使用 OpenCV 的 Emgu C 包装器为图像的反向投影创建直方图 我有以下 OpenCV C 代码 我试图将其转换为 Emgu C char filename char C Images items jpg Mat im i
  • JSF PRG 存在验证错误

    我正在使用带有 PRG 模式的 JSF 在我的导航规则中使用 问题是当我收到验证错误时 例如 用户未设置强制值 重定向未完成 即发布后紧接着获取同一页面 场景是 用户没有输入必填值并提交表单 发生验证错误 并且显示相同视图时出现错误 消息
  • 如何在 ASP.Net MVC 中初始化 Webhook 接收器

    我正在遵循本指南here用于在 ASP Net MVC 中安装和使用 webhook 但看起来本指南适用于 wep api 类型项目 我正在使用 MVC 类型的项目 并且没有 Register 方法 这与 API 项目不同 在 MVC 中
  • 相当于Angular2中的ng-repeat来获取JSON对象的键[重复]

    这个问题在这里已经有答案了 我正在寻找一种使用 Angular2 将 JSON 对象浏览到 HTML 页面的方法 为了得到每个键和每个值 在 AngularJS 中 可以使用指令ng repeat div key div 但在 Angula
  • 如何使用 SharpSVN 访问预提交挂钩中的文件信息

    总的来说 我对 SharpSVN 和 SVN 很陌生 我正在尝试实现一个预提交挂钩 当用户提交某种类型的 XML 文件时 在允许提交文件之前 我需要拦截该文件并对其进行分析 以确保它们包含某些元素 由于 SVN 似乎提交了两个参数 存储库路
  • 获取具有特定时间的 Date() 对象

    我想获取一周的开始日期 我能够获取日期 只是返回的日期具有当前系统时间的时间 例如 如果现在是 19 20 我得到的周开始日期为日期 2012 年 3 月 26 日星期一 19 20 16 GMT 0530 IST 为了准确计算 我需要时间
  • React js从父组件更改子组件的状态

    我有两个组件 父组件我想从中更改子组件的状态 class ParentComponent extends Component toggleChildMenu render return div div
  • SwiftUI显示gif图像

    swiftUI中显示动画gif图片的方法 因为图像 Image fall leaves 不支持gif 回答如下 在 swiftUI 中显示 gif 图像的最简单 最快的方法是使用Preview QuickLook QL QLPreviewV
  • 在sql中生成随机名称

    我有 5 个男性和女性的随机名字 我需要根据性别插入随机名称 但是我们如何在 SQL 中从一组 5 个名称中随机插入名称 是否可以 select name from table order by newid
  • JSF 中组件的水平放置

    应该很简单 但我找不到答案 我想水平放置组件而不是垂直放置 我想要实现的是一个丰富的 具有 2 行或更多行的工具栏 我一直在尝试使用具有面板网格和两个面板组的工具栏来做到这一点 如下所示
  • 如何让窗口绝对置顶?

    我用设置窗口位置api 使用 HWND TOPMOST 参数使我的窗口位于最顶层 它工作正常 但工具提示仍然位于其之上 如何让我的窗口位于所有窗口之上 我缺少一个 api 吗 Edit 我用计时器检查前景窗口然后将我的窗口设置为最上面来修复
  • Ramda:通过与另一个数组中的每个项目进行比较来从数组中获取对象

    我有一个像这样的数组 ids 1 3 5 和另一个数组 例如 items id 1 name a id 2 name b id 3 name c id 4 name d id 5 name e id 6 name f 我想要的是另一个数组
  • Mavericks 安装后 Sublime Text 2 命令行无法运行

    我已经准备好通过 Stack Overflow 上的其他线程 尽管我付出了努力 但问题似乎并未解决 自从安装 OS X Mavericks 以来 我无法从命令行打开 Sublime Text 2 我尝试遵循以下准则 http benkwok
  • 自定义将结构解组为切片映射

    我以为我现在已经理解了解组 但我想还没有 我在用 Go 解组地图时遇到了一些麻烦 这是我到目前为止的代码 type OHLC RESS struct Pair map string Candles Last int64 json last