golang 断言:一个蛋疼的处理场景

本贴最后更新于 1327 天前,其中的信息可能已经时过境迁

这一切都来源于一个蛋疼的需求场景处理:

因为历史原因,一个需要用到的 JSON 数据被整个缓存进 Redis 的一个 key 中,大概如下:

127.0.0.1:6379> get dt "{\"address\":[{\"duration\":90,\"format\":\"mp4\",\"url\":\"xxx.mp4\",\"ext\":\"{\\\"key\\\":\\\"val\\\"}\"},{\"duration\":90,\"format\":\"mp4\",\"url\":\"xxx.mp4\",\"ext\":\"{\\\"key\\\":\\\"val\\\"}\"}],\"value\":\"web\"}" 127.0.0.1:6379>

这里还是做了脱敏处理,实际的情形 JSON 的层级更深...
格式化显示的 JSON 结构大概是这样:

{ "address": [ { "duration": 90, "format": "mp4", "url": "xxx.mp4", "ext": "{\"key\":\"val\"}" }, { "duration": 90, "format": "mp4", "url": "xxx.mp4", "ext": "{\"key\":\"val\"}" } ], "value": "web" }

现在要做的是: address 里的每个元素的 url 字段需要更新。

现在知道的是:address 的值 是一个数组,数组的每个元素是一个 map[string]interface{} 类型,map 里的元素除了 "url": "xxx.mp4" , 其他的数量不确定

实现代码大概如下(方便展示,省略了 Redis 读写的步骤):

detailByte := []byte(`{"address":[{"duration":90,"format":"mp4","url":"xxx.mp4","ext":"{\"key\":\"val\"}"},{"duration":90,"format":"mp4","url":"xxx.mp4","ext":"{\"key\":\"val\"}"}],"value":"web"}`) detail := make(map[string]interface{}, 0) json.Unmarshal(detailByte, &detail) formatJson, _ := json.MarshalIndent(detail, "", " ") fmt.Println("before: ", string(formatJson)) if address, ok := detail["address"]; ok { if item, ok2 := address.([]interface{}); ok2 { for index, value := range item { if vMap, ok3 := value.(map[string]interface{}); ok3 { if _, ok4 := vMap["url"]; ok4 { vMap["url"] = "wtf.mp4" } item[index] = vMap } } detail["address"] = item } } formatJson, _ = json.MarshalIndent(detail, "", " ") fmt.Println("after: ", string(formatJson))

运行结果:

before: { "address": [ { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "xxx.mp4" }, { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "xxx.mp4" } ], "value": "web" } after: { "address": [ { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "wtf.mp4" }, { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "wtf.mp4" } ], "value": "web" }

怎么说呢,实现了感觉又没有真正实现...

哎,蛋疼。

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 255 关注
  • 类型断言
    1 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • yliu7949 1

    没接触过 Redis,但如果 json 数据可以转化为 string 类型的话,那么可以试试 "github.com/tidwall/sjson" 这个包,核心语句只有一行 sjson.Set(json, "address.#.url", "wtf.mp4")

    代码:

    package main import "github.com/tidwall/sjson" const json = `{ "address": [ { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "xxx.mp4" }, { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "xxx.mp4" } ], "value": "web" }` func main() { value, _ := sjson.Set(json, "address.#.url", "wtf.mp4") println(value) }

    输出:

    { "address": [ { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "wtf.mp4" }, { "duration": 90, "ext": "{\"key\":\"val\"}", "format": "mp4", "url": "wtf.mp4" } ], "value": "web" }
    1 回复
  • xuanskyer via macOS
    作者

    妙啊!

    1 操作
    xuanskyer 在 2021-12-06 16:22:38 更新了该回帖

推荐标签 标签

  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 545 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 398 关注
  • abitmean

    有点意思就行了

    36 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 369 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 1 关注
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖 • 3 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 650 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 75 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 179 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 686 关注
  • danl
    181 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 4 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 543 回帖 • 3 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖 • 2 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 15 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 643 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 407 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 158 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1021 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖