Go语言怎么把json中的键名处理成map中的key

yz23je · 2022-06-24 11:18:49 · 3349 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-06-24 11:18:49 的主题,其中的信息可能已经有所发展或是发生改变。

go写的程序,现在要弄一个程序的配置文件,现在用的方法就是,json的配置文件中的键名与go中定义的结构体一一对应,这样就可以使用第三方库jsoniter或者go自已的json处理库把json文件中的内容进行处理,并把结果保存到了全局变量中,方便其它文件调用。 解决了当某个配置项要临时调整时,只要在配置文件中修改一下,再重新加载一次就可以。但无法解决如果要添加多一个配置项这个问题,因为如果要添加多一个配置项,除了json配置文件要做添加,还要在go语言中定义的结构体做添加才可以。而现在想的是,使用map然后把json中的键当做map的key。json中的值当做map的值,这样以后就只需要修改配置文件,而不需要修改go文件了。 所以想问问不在引入第三库的前提下,怎么把json的键名处理成map的key

大概是就是下面这样的

// 配置文件
{
  "config": {
    "a": "aa",
    "b": "bb",
    "c": "20",
  },
  "config_test": {
    "a": "aa",
    "b": "bb",
    "c": "20",
  }
}

我的json配置文件的格式是上面那样的,有什么法子可以处理成以下的方法方式吗?

abc["config"]["a"] // 值为aa

不华丽的分割线

abc["config_test"]["c"] // 值为20


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3349 次点击  ∙  1 赞  
加入收藏 微博
12 回复  |  直到 2022-07-05 10:50:49
ycyyds
ycyyds · #1 · 3年之前

不知道你是不是这个意思,可以直接把json文件读出来,然后反序列化到一个map[][]结构中 f, err := os.Open("test.txt") if err != nil { klog.Error(err) return }

byte1, err := ioutil.ReadAll(f)
if err != nil {
    klog.Error()
}
var temp map[string]string
err = json.Unmarshal(byte1, &temp)
if err != nil {
    klog.Error(err)
    return
}

klog.Info(temp["one"])

yz23je
yz23je · #2 · 3年之前
ycyydsycyyds #1 回复

不知道你是不是这个意思,可以直接把json文件读出来,然后反序列化到一个map[][]结构中 f, err := os.Open("test.txt") if err != nil { klog.Error(err) return } byte1, err := ioutil.ReadAll(f) if err != nil { klog.Error() } var temp map[string]string err = json.Unmarshal(byte1, &temp) if err != nil { klog.Error(err) return } klog.Info(temp["one"])

谢谢,就是这个

yz23je
yz23je · #3 · 3年之前

1楼 @ycyyds

{
  "config": {
    "a": "aa",
    "b": "bb",
    "c": "20",
  },
  "config_test": {
    "a": "aa",
    "b": "bb",
    "c": "20",
  }
}

你好,试了一个你给的方法,当json中就只有一个对象的时候可以成功访问了,但是我的json配置文件的格式是上面那样的,有什么法子可以处理成以下的方法方式吗?

abc["config"]["a"] // 值为aa

不华丽的分割线

abc["config_test"]["c"] // 值为20

lysShub
lysShub · #4 · 3年之前

配置文件的所有选项是确定的,哪有临时加一个的

liangmanlin
liangmanlin · #5 · 3年之前

map[string]interface

yz23je
yz23je · #6 · 3年之前
lysShublysShub #4 回复

配置文件的所有选项是确定的,哪有临时加一个的

因为后面在升级功能的时候,也是要用到配置项,但是后期的功能会用到哪些配置项还不知道。所以要是在以后增加了新功能之后,只需要在配置中新添加键值对,就可以给新功能使用,而不用再写一个多的struct来接收,因为配置项也只是在项目加载一次之后,就不动了。所以……这就有了这一出……

yz23je
yz23je · #7 · 3年之前
liangmanlinliangmanlin #5 回复

map[string]interface

这个试了,可以拿出来,但是无法转成map[string]string这样的

serious-snow
serious-snow · #8 · 3年之前

使用map[string][]byte 然后根据不同的key 分别去反序列化不同的对象

yz23je
yz23je · #9 · 3年之前
serious-snowserious-snow #8 回复

使用map[string][]byte 然后根据不同的key 分别去反序列化不同的对象

不行,从文件中读取json配置的时候,使用map[string][]byte接收时,直接报错,不管是用原生的反序列化或第三方的,都不得

YuriPuck
YuriPuck · #10 · 3年之前

{ "config": { "a": "aa", "b": "bb", "c": "20", }, "config_test": { "a": "aa", "b": "bb", "c": "20", } }

这个是有问题的,最后一个元素后面不能加入","

结构正确后,直接用map[string]map[string]string去反序列化就行了

yz23je
yz23je · #11 · 3年之前
YuriPuckYuriPuck #10 回复

{ "config": { "a": "aa", "b": "bb", "c": "20", }, "config_test": { "a": "aa", "b": "bb", "c": "20", } } 这个是有问题的,最后一个元素后面不能加入"," 结构正确后,直接用map[string]map[string]string去反序列化就行了

牛,按你说的成功了,问题解决。谢谢

serious-snow
serious-snow · #12 · 3年之前

9楼 @yz23je 对不起, 我说错了,不能用[]byte,得用json.RawMessage

使用 map[string]json.RawMessage

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传