当前位置: 首页 > news >正文

go-simplejson 插入数组 - liyan

问题描述

// 创建了一个json对象J,需要从其他地方获取剩余json信息后,插入到J中的data字段中。初始版本如下:
import ("fmt"simplejson "github.com/bitly/go-simplejson"
)func main() {js, _ := simplejson.NewJson([]byte(`
{
"errno": 0,
"errmsg": "test"
}`))var js_2 = new(simplejson.Json)*js_2 = *jsjsArr := []*simplejson.Json{}js1, _ := simplejson.NewJson([]byte(`{"num": 1}`))js2, _ := simplejson.NewJson([]byte(`{"num": 2}`))jsArr = append(jsArr, js1)jsArr = append(jsArr, js2)js.Set("data", jsArr)js.Get("data").GetIndex(0).Set("test", 1)jsB, _ := js.MarshalJSON()fmt.Println(string(jsB)) 
}
// % go run js_check.go
// {"data":[{"num":1},{"num":2}],"errmsg":"test","errno":0}

问题排查

经过dlv逐行调试,实际问题出在js.Get("data").GetIndex(0).Set("test", 1)中。跳转至定义,该操作实际做如下转换:

arr, ok := js.Get("data").data.([]interface{})
if ok {&simplejson.Json(arr[index]).Set("test", 1)
}

这里由于jsArr[]*simplejson.Json,类型断言为[]interface{}失败。所以无法正常设置值。查看simplejson.go,其中的Json对象结构如下:

type Json struct {data interface{}
}

其实可以通过js.Interface()获取其中的真实数据。

解决方案

变更为如下代码即可:

package mainimport ("fmt"simplejson "github.com/bitly/go-simplejson"
)func main() {js, _ := simplejson.NewJson([]byte(`
{
"errno": 0,
"errmsg": "test"
}`))var js_2 = new(simplejson.Json)*js_2 = *jsjsArr := []interface{}{}js1, _ := simplejson.NewJson([]byte(`{"num": 1}`))js2, _ := simplejson.NewJson([]byte(`{"num": 2}`))jsArr = append(jsArr, js1.Interface())jsArr = append(jsArr, js2.Interface())js.Set("data", jsArr)js.Get("data").GetIndex(0).Set("test", 1)jsB, _ := js.MarshalJSON()fmt.Println(string(jsB))
}
// % go run js_check.go
// {"data":[{"num":1,"test":1},{"num":2}],"errmsg":"test","errno":0}
http://www.jsqmd.com/news/417108/

相关文章:

  • laya列表滚动问题
  • 2026年全国vw80300标准测试方案厂商排名,靠谱品牌推荐 - 工业品牌热点
  • 2026年苏州地区靠谱的AI搜索优化服务厂家排名,AI搜索优化哪家强 - 工业设备
  • emacs org-mode 绘制思维导图 - liyan
  • Paperzz 论文查重:学术写作的智能护航者
  • go-1.17+ 调用规约 - liyan
  • P2522 [HAOI2011] Problem b
  • golang proto3 使用 - liyan
  • PaperZZ论文查重系统全解析:从查重到AIGC检测,一站式学术诚信守护方案
  • 【译文/effective-rust】第 27 条:为公共接口撰写文档 - liyan
  • golang GMP - liyan
  • eBPF tail-calls示例 - liyan
  • 视频创作者最易踩的5个版权“深坑”,你中了几个
  • ebpf 采集ebpf 采集tag+tcp五元组 - liyan
  • 正则替换拷贝
  • emacs-若干语言 lsp 配置备注 - liyan
  • Linux sed 命令
  • 【面板数据】更新-省级产业结构高级化及合理化数据-含代码(2000-2024年)
  • AgentRun 实践指南:Agent 的宝藏工具——All-In-One Sandbox
  • Emacs 字符操作快捷键 - liyan
  • 全国艺术留学推荐,看看满足条件后哪个学校和中介通过率更高 - mypinpai
  • win10 安装ffmpeg
  • 浙江杭泰产品质量与种类情况,在多地服务的费用贵吗 - 工业推荐榜
  • Gemini 3.1 Flash Image (Nano Banana 2) API 评测:从参数到落地,我替你踩了坑 - 147API
  • 2026年化工生产用氨水采购指南:脱硫/电子级/食品级氨水专业供应商推荐 - 品牌推荐官
  • 岱宇国际在上海的口碑排名,看看其技术实力、品牌知名度和用户体验 - myqiye
  • 分析2026年宁德性价比高的全屋定制,生产厂合作案例多的排名 - 工业品牌热点
  • Rust枚举OptionT
  • 2026年GEO营销风向标:国内领先的GEO整合营销服务商排名及TOP 3选型指南 - 资讯焦点
  • 2026年最新喷胶厂商实力排行榜:基于环保性能与市场口碑的五大公司权威推荐榜单 - 十大品牌榜