中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-24 17:23:06 來源:腳本之家 閱讀:483 作者:CodingCode 欄目:編程語言

使用一個例子說明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 main

import "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)
}

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙口市| 龙泉市| 武夷山市| 十堰市| 奉化市| 五指山市| 台湾省| 个旧市| 揭阳市| 钟山县| 泗水县| 中阳县| 嘉黎县| 五台县| 普宁市| 海晏县| 盐城市| 东兴市| 靖州| 长汀县| 德江县| 会泽县| 西贡区| 黑山县| 漳浦县| 金乡县| 康定县| 达孜县| 津市市| 邵武市| 芜湖县| 洛浦县| 大方县| 丹巴县| 利辛县| 临夏县| 茂名市| 额敏县| 开封县| 芷江| 兖州市|