经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JSON » 查看文章
golang如何修改json文件内容的方法示例
来源:jb51  时间:2018/10/8 8:45:55  对本文有异议

使用一个例子说明golang如何访问和修改json文件;主要分三步:

  1. 从文件读入json串

  2. 把json串转变成golang对象

  3. 遍历或者修改json值

  4. 写回文件

假定用户输入json串为:

  1. {
  2.  "user": {
  3.   "mspid": "admin",
  4.   "email": "admin@domain.com"
  5.  }, 
  6.  "nodes": [
  7.   {  
  8.    "name": "node1",
  9.    "location": "node1.domain.com:8080"
  10.   }, 
  11.   {  
  12.    "name": "node2",
  13.    "location": "node2.domain.com:8080"
  14.   }  
  15.  ]
  16. }

我们的目标是把node1和node2的location域换掉。

代码如下

  1. import (
  2.   "fmt"
  3.   "io/ioutil"
  4.   "encoding/json"
  5. )
  6.  
  7. func HandleJson(jsonFile string, outFile string) error {
  8.   // Read json buffer from jsonFile
  9.   byteValue, err := ioutil.ReadFile(jsonFile)
  10.   if err != nil {
  11.     return err
  12.   }
  13.  
  14.   // We have known the outer json object is a map, so we define result as map.
  15.   // otherwise, result could be defined as slice if outer is an array
  16.   var result map[string]interface{}
  17.   err = json.Unmarshal(byteValue, &result)
  18.   if err != nil {
  19.     return err
  20.   }
  21.  
  22.   // handle peers
  23.   nodes:= result["nodes"].([]interface{})
  24.   for _, node:= range node{
  25.     m := node.(map[string]interface{})
  26.     if name, exists := m["name"]; exists {
  27.       if name == "node1" {
  28.         m["location"] = "new-value1"
  29.       } else if name == "node2" {
  30.         m["location"] = "new-value2"
  31.       }
  32.     }
  33.   }
  34.  
  35.   // Convert golang object back to byte
  36.   byteValue, err = json.Marshal(result)
  37.   if err != nil {
  38.     return err
  39.   }
  40.  
  41.   // Write back to file
  42.   err = ioutil.WriteFile(outFile, byteValue, 0644)
  43.   return err
  44. }

这个地方主要用的是golang的interface{}数据类型,然后把interface{}转换成真正的数据类型。

这个函数可以扩充成动态的解析任何类型,只要把所有的类型全部定义成interface{},然后使用动态类型检测就可以知道每一个具体元素的类型了,最终达到类型jq的功能,访问和修改json文件。

  1. var x interface{} = ...
  2.  
  3. switch x.(type) {
  4.   case nil:
  5.     fmt.Println("x is nil")
  6.   case int: 
  7.     fmt.Println("x is int")
  8.   case bool :
  9.     fmt.Println("x is bool")
  10.   case string:
  11.     fmt.Println("x is string")
  12.   case []interface{}:
  13.     fmt.Println("x is slice")
  14.   case map[string]interface{}:
  15.     fmt.Println("x is map")
  16.   default:
  17.     fmt.Println("type unknown")
  18.   }  
  19. }

PS:据说json-iteator 是目前golang中对json格式数据处理最快的包(比官方json包快6倍),好像是滴滴团队开源的,使用起来也非常方便,有兴趣的可以学习学习,下面我们看看官方的示例代码,使用起来也是很方便

  1. package main
  2.  
  3. import "github.com/json-iterator/go"
  4.  
  5. type User struct {
  6.   Name string
  7.   Age int8
  8. }
  9.  
  10. func main() {
  11.   user := User{
  12.       Name: "tanggu",
  13.       Age: 18,
  14.     }
  15.     var jsoniter = jsoniter.ConfigCompatibleWithStandardLibrary
  16.     // 序列化
  17.     data, err := jsoniter.Marshal(&user)
  18.     if err != nil {
  19.       log.Fatal(err)
  20.     }
  21.     fmt.Println(string(data))
  22.  
  23.     // 反序列化
  24.     var people User
  25.     err = jsoniter.Unmarshal(data, &people)
  26.     if err != nil {
  27.       log.Fatal(err)
  28.     }
  29.     fmt.Println(people)
  30. }

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号