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

使用一个例子说明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)
}

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

(0)

相关推荐

  • Go语言的JSON处理详解

    Go语言内建对JSON的支持.使用Go语言内置的encoding/json标准库,开发者可以轻松使用Go程序生成和解析JSON格式的数据.在Go语言实现JSON的编码和解码时,遵循RFC4627协议标准. 1.编码为JSON格式 使用json.Marshal()函数可以对一组数据进行JSON格式的编码.json.Marshal()函数的声明如下: 假如有如下一个Book类型的结构体: 并且有如下一个Book类型的实例对象: 然后,我们可以使用json.Marshal()函数将gobook实例生成

  • 利用Golang解析json数据的方法示例

    本文主要给大家介绍的是关于Golang解析json数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 使用 Golang 解析 json 数据,这种 json 格式是对象的数组,官方文档有一个示例: var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll

  • Golang map如何生成有序的json数据详解

    前言 本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先来看一段 Golang 生成 json 的代码,首先定义了一个 map[string]interface{}  的变量,然后存一些值,这里要注意的是 previews 字段,为了浏览器获取到的 json 数据是有序的,所以定义了一个 map[int]map[string]string 的类型,加上了一个表示顺序的键: list := make(map[strin

  • Golang JSON的进阶用法实例讲解

    痛点 json 是当前最常用的数据传输格式之一,纯文本,容易使用,方便阅读,在通信过程中大量被使用. 你是否遇到过json中某个字段填入某种类型都适合而陷入两难境地? (例如:定义了一个port字段,你却不知道是填入 8080 ,还是 "8080" 的尴尬局面) 你是否遇到过json反解析报错是因为填入字段的类型不匹配导致的?例如: json: cannot unmarshal number into Go struct field Host.port of type string 你

  • golang如何自定义json序列化应用详解

    前言 Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.下面这篇文章主要介绍了关于golang自定义json序列化应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 问题引入 当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,对其进行json序列化,比如 type Message struct { From string `json:"from"` To string `json:&

  • golang中json反序列化可能遇到的问题

    前言 在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了) var val float64 val = 1000000 fmt.Println(val) // ==> 1e+06 而在日常开发中,我们经常遇到这样一个问题,就是要反序列化前端传递来的json,因为数据结构未知,所以我们便会使用map[string]interface{}来接收反序列化的结果.由于golang将json解析到interface{}类型的时

  • golang json性能分析详解

    前言 众所周知Json 作为一种重要的数据格式,具有良好的可读性以及自描述性,广泛地应用在各种数据传输场景中.Go 语言里面原生支持了这种数据格式的序列化以及反序列化,内部使用反射机制实现,性能有点差,在高度依赖 json 解析的应用里,往往会成为性能瓶颈,好在已有很多第三方库帮我们解决了这个问题,但是这么多库,对于像我这种有选择困难症的人来说,到底要怎么选择呢,下面就给大家来一一分析一下 ffjson go get -u github.com/pquerna/ffjson 原生的库性能比较差的

  • Golang中使用JSON的一些小技巧分享

    前言 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用. 本来用一个json:",string" 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了. 参考文章: JSON and struct composition in Go 临时忽略struct字段 type User struct { Email string `json:"email"` Password string `json:"password&qu

  • golang实现sql结果集以json格式输出的方法

    本文实例讲述了golang实现sql结果集以json格式输出的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: func getJSON(sqlString string) (string, error) {     stmt, err := db.Prepare(sqlString)     if err != nil {         return nil, err     }     defer stmt.Close()     rows, err := stmt.Query

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

    使用一个例子说明golang如何访问和修改json文件:主要分三步: 从文件读入json串 把json串转变成golang对象 遍历或者修改json值 写回文件 假定用户输入json串为: { "user": { "mspid": "admin", "email": "admin@domain.com" }, "nodes": [ { "name": "no

  • 利用python修改json文件的value方法

    做工程时遇到需要监听json文件,根据json文件中的key-value值作出相应处理的情形.为此写了修改json文件的python脚本供工程后续调用. 代码如下: # coding=utf-8 //设置文本格式 import os,sys import json def get_new_json(filepath,key,value): key_ = key.split(".") key_length = len(key_) with open(filepath, 'rb') as

  • Java实现批量修改txt文件名称的方法示例

    本文实例讲述了Java实现批量修改txt文件名称的方法.分享给大家供大家参考,具体如下: 最近在做特征选择的实验时,需要批量修改一下文件名称,在这里做一下记录. package com.cqu.experiment; import java.io.File; /** * @author 作者: E-mail:@126.com * @version 创建时间:2016年12月26日 下午3:02:01 类说明 */ public class RenameTxt { public static vo

  • Python实现修改文件内容的方法分析

    本文实例讲述了Python实现修改文件内容的方法.分享给大家供大家参考,具体如下: 1 替换文件中的一行 1.1 修改原文件 ① 要把文件中的一行Server=192.168.22.22中的IP地址替换掉,因此把整行替换. data = '' with open('zhai.conf', 'r+') as f: for line in f.readlines(): if(line.find('Server') == 0): line = 'Server=%s' % ('192.168.1.1',

  • golang socket断点续传大文件的实现方法

    在日常编程中,我们肯定会遇到用socket传送文件内容,如果是大文件的,总不能传送到一半因某原因断掉了,又从新传送文件内容吧.对,我们需要续传,也就是接着上次传送的位置继续发送文件内容. 续传的话,其实并不难,我理解的思路大概如下: 客户端发送消息询问服务端,你上次接收到的文件内容位置 服务端告诉客户端上次接收到的文件内容位置 客户端就从上次断点的位置继续发送文件内容 客户端发送文件内容完毕后通知服务端,然后断开连接 下面我们看看代码的实现 服务端 // file name: server.go

  • python 读写txt文件 json文件的实现方法

    首先第一步,打开文件,有两个函数可供选择:open() 和  file() ①. f = open('file.txt','w')    ...  file.close() ②. f = file('file.json','r')    ... file.close()#记得打开文件时最后不要忘记关闭! open() 和 file() 都是Python的内建函数,返回一个文件对象,具有相同的功能,可以任意替换.使用语法为: f = open(fileName, access_mode='r',

  • Python编程修改MP3文件名称的方法

    本文实例讲述了Python编程修改MP3文件名称的方法.分享给大家供大家参考,具体如下: 最近刚刚开始学习Python,顺便锻炼思维写的一个小函数,专门用来修改那些网上下载的mp3歌曲后名称不正确时候,使用该函数,使用方法 ModifyMp3FileInfo(r'E:/音乐/12345.mp3') Python代码: #!修改下载的Mp3文件名称为正确的Mp3文件 def ModifyMp3FileInfo(filename): mp3Id3V1 = { "tag":{"va

  • Python实现解析Bit Torrent种子文件内容的方法

    本文实例讲述了Python实现解析BitTorrent种子文件内容的方法.分享给大家供大家参考,具体如下: 有很多种子文件,有时候记不清里面都是什么东西,又不想一个一个的拖放到迅雷或BT软件里头看, 上网查了一下Python的脚本,自己也稍微修改了一下,代码如下,粘贴到文本编辑器中: 保存成py后缀的,直接运行 import re def tokenize(text, match=re.compile("([idel])|(/d+):|(-?/d+)").match): i = 0 w

  • nodejs读写json文件的简单方法(必看)

    nodejs 读json文件 var fs=reauire('fs'); var file="d:\\0.json"; var result=JSON.parse(fs.readFileSync( file)); //操作对象 nodejs 写json文件 var coors = {}; coors.left_top = {}; coors.right_top = {}; coors.left_bottom = {}; coors.right_bottom = {}; //填充coor

  • JavaScript实现解析INI文件内容的方法

    本文实例讲述了JavaScript实现解析INI文件内容的方法.分享给大家供大家参考,具体如下: .ini 是Initialization File的缩写,即初始化文件,ini文件格式广泛用于软件的配置文件. INI文件由节.键.值.注释组成. 根据node.js版本的node-iniparser改写了个JavaScript函数来解析INI文件内容,传入INI格式的字符串,返回一个json object. function parseINIString(data){ var regex = {

随机推荐