a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Golang > 正文

golang如何修改json文件內容的方法示例

2020-04-01 18:52:53
字體:
來源:轉載
供稿:網友

使用一個例子說明golang如何訪問和修改json文件;主要分三步:

  1. 從文件讀入json串
  2. 把json串轉變成golang對象
  3. 遍歷或者修改json值
  4. 寫回文件

假定用戶輸入json串為:

{ "user": {  "mspid": "admin",  "email": "admin@domain.com" },  "nodes": [  {     "name": "node1",   "location": "node1.domain.com:8080"  },   {     "name": "node2",   "location": "node2.domain.com:8080"  }   ]}

我們的目標是把node1和node2的location域換掉。

代碼如下

import (  "fmt"  "io/ioutil"  "encoding/json")func HandleJson(jsonFile string, outFile string) error {  // Read json buffer from jsonFile  byteValue, err := ioutil.ReadFile(jsonFile)  if err != nil {    return err  }  // We have known the outer json object is a map, so we define result as map.  // otherwise, result could be defined as slice if outer is an array  var result map[string]interface{}  err = json.Unmarshal(byteValue, &result)  if err != nil {    return err  }  // handle peers  nodes:= result["nodes"].([]interface{})  for _, node:= range node{    m := node.(map[string]interface{})    if name, exists := m["name"]; exists {      if name == "node1" {        m["location"] = "new-value1"      } else if name == "node2" {        m["location"] = "new-value2"      }    }  }  // Convert golang object back to byte  byteValue, err = json.Marshal(result)  if err != nil {    return err  }  // Write back to file  err = ioutil.WriteFile(outFile, byteValue, 0644)  return err}

這個地方主要用的是golang的interface{}數據類型,然后把interface{}轉換成真正的數據類型。

這個函數可以擴充成動態的解析任何類型,只要把所有的類型全部定義成interface{},然后使用動態類型檢測就可以知道每一個具體元素的類型了,最終達到類型jq的功能,訪問和修改json文件。

var x interface{} = ...switch x.(type) {  case nil:    fmt.Println("x is nil")  case int:     fmt.Println("x is int")  case bool :    fmt.Println("x is bool")  case string:    fmt.Println("x is string")  case []interface{}:    fmt.Println("x is slice")  case map[string]interface{}:    fmt.Println("x is map")  default:    fmt.Println("type unknown")  }  }

PS:據說json-iteator 是目前golang中對json格式數據處理最快的包(比官方json包快6倍),好像是滴滴團隊開源的,使用起來也非常方便,有興趣的可以學習學習,下面我們看看官方的示例代碼,使用起來也是很方便

package mainimport "github.com/json-iterator/go"type User struct {  Name string  Age int8}func main() {  user := User{      Name: "tanggu",      Age: 18,    }    var jsoniter = jsoniter.ConfigCompatibleWithStandardLibrary    // 序列化    data, err := jsoniter.Marshal(&user)    if err != nil {      log.Fatal(err)    }    fmt.Println(string(data))    // 反序列化    var people User    err = jsoniter.Unmarshal(data, &people)    if err != nil {      log.Fatal(err)    }    fmt.Println(people)}

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人一级 | 久草青青草 | 日韩电影一区二区三区 | 成人在线国产 | 中文视频在线 | 国产在线精品一区二区三区 | 成人午夜精品一区二区三区 | 青青草精品 | 国产精品久久久久久久久久三级 | 日韩欧美一区二区视频 | 日韩欧美一区二区三区免费观看 | 久久精品一级 | 国产乱码精品一区二区 | 制服 丝袜 激情 欧洲 亚洲 | 日韩在线不卡 | 四虎新网站| 精品影视一区二区 | 999在线观看精品免费不卡网站 | 在线观看你懂的视频 | 亚洲第一国产精品 | 中文字幕亚洲第一 | 精品国偷自产国产一区 | 久久久精品影院 | 国产一在线| 国产精品1区2区 | 久久久99日产 | 啊v在线 | 亚洲 欧美日韩 国产 中文 | 日韩精品一区二区三区在线播放 | 欧美一区永久视频免费观看 | 亚洲成人中文字幕 | av看片网 | 超碰97免费在线 | 婷婷色综合色 | 亚洲精品一区二区三区 | 久久国产精彩视频 | 欧美一区二区三区黄色 | 在线一区 | 亚洲情网站 | 日韩在线精品 | 一本大道久久a久久精二百 羞羞视频在线观免费观看 国产第一区在线观看 |