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

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

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

因为历史原因,一个需要用到的 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 发布的第二款编程语言。

    501 引用 • 1396 回帖 • 243 关注
  • 类型断言
    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 更新了该回帖

推荐标签 标签

  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 244 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 453 关注
  • Firefox

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

    7 引用 • 30 回帖 • 363 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 526 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    347 引用 • 762 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 8 关注
  • OpenCV
    15 引用 • 36 回帖 • 4 关注
  • OnlyOffice
    4 引用 • 30 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    188 引用 • 833 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 16 关注
  • Follow
    4 引用 • 12 回帖 • 17 关注
  • 笔记

    好记性不如烂笔头。

    311 引用 • 790 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1340 回帖 • 1 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 357 关注
  • OneDrive
    2 引用 • 5 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    51 引用 • 200 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 114 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 1 关注
  • Hexo

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

    22 引用 • 148 回帖 • 24 关注
  • RemNote
    2 引用 • 16 回帖 • 38 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 237 关注
  • AWS
    11 引用 • 28 回帖 • 1 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 355 关注