1. 实验需求


这里我主要侧重对编码实现的记录。
2. 编码实现
package main
import (
"bufio"
"encoding/json"
"fmt"
"io"
"os"
"strconv"
"strings"
)
type Pin struct {
Field1 int `json:"2"`
Field2 int `json:"3"`
}
type DIdata struct {
Temperature int `json:"温度"`
Humidity int `json:"湿度"`
Date string `json:"日期"`
Pin Pin `json:"引脚"`
}
type ResDate struct {
DIdata DIdata `json:"DIdata"`
}
func main() {
for {
fmt.Println("请输入命令:")
work()
fmt.Println()
}
}
func work() {
var input string
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n') //读取一行输入
if err != nil {
fmt.Println("出现错误,请重试", err)
return
}
input = strings.TrimSuffix(input, "\r\n") //去掉换行符
split := strings.Split(input, " ")
keyWord := split[0]
//fmt.Printf("%#v\n",)
if keyWord == "creatf" { //创建json文件
content := strings.Trim(input, keyWord+" ") //命令后的内容
//json反序列化
var objContent ResDate
err = json.Unmarshal([]byte(content), &objContent)
if err != nil {
fmt.Println("输入错误。")
panic(err)
}
replace := strings.Replace(objContent.DIdata.Date, "/", "-", -1)
//fmt.Println(replace) //日期分隔符格式转化
mkFile(replace, content)
} else if keyWord == "addjson" { //在指定json文件中添加数据
content := strings.Trim(input, keyWord+" "+split[1]+" ") //命令后的内容
//json反序列化
var objContent ResDate
err = json.Unmarshal([]byte(content), &objContent)
if err != nil {
fmt.Println("输入错误。")
panic(err)
}
addFile(split[1], content)
} else if keyWord == "findjson" { //在指定json文件中查找数据
key := split[1]
fileName := split[3]
findFile(fileName, key)
//fmt.Println("find")
} else {
fmt.Println("输入不合法请重新输入,注意命令前不要添加空格。")
}
//fmt.Println(input)
//split := strings.Split(input, " ")
//
//fmt.Println(split[0])
//fmt.Println(input)
//marshal, _ := json.Marshal(request)
//fmt.Println(string(marshal))
//fmt.Println(request)
//fmt.Println()
}
/**
fileName 文件名称
key 关键词
*/
func findFile(fileName string, key string) {
// 向标准输出写入内容
var fileObj = &os.File{}
_, err := os.Stat("./" + fileName)
if err != nil { //如果文件不存在
fmt.Println("文件:" + fileName + "不存在")
return
}
fileObj, _ = os.OpenFile("./"+fileName, os.O_CREATE|os.O_RDONLY|os.O_APPEND, 0666)
defer fileObj.Close()
//读取数据
//var data = make([]byte, 100)
reader := bufio.NewReader(fileObj)
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
if err != nil {
return
}
//for i := 0; i < len(line); i++ {
// data = append(data, line[i])
//}
if strings.Contains(string(line), key) {
fmt.Println(string(line))
}
}
fmt.Println("已经展示文件:" + fileName + "中所有\"时间\"为\"" + key + "\"的数据")
//var objContent ResDate
//json.Unmarshal(data, &objContent)
//println(data)
//println(string(data))
}
/**
fileName 文件名称
content 添加内容
*/
func addFile(fileName string, content string) {
// 向标准输出写入内容
var fileObj = &os.File{}
_, err := os.Stat("./" + fileName)
if err != nil { //如果文件不存在
fmt.Println("文件:" + fileName + "不存在")
}
fileObj, _ = os.OpenFile("./"+fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
defer fileObj.Close()
// 获取writer对象
writer := bufio.NewWriter(fileObj)
writer.WriteString(content + "\n")
// 刷新缓冲区,强制写出
writer.Flush()
fmt.Println("增加数据成功," + content)
}
/**
fileName 文件名称
content 添加内容
*/
func mkFile(fileName string, content string) {
// 向标准输出写入内容
fileName = fileName + "h"
var fileObj = &os.File{}
for i := 1; i < 999; i++ {
_, err := os.Stat("./" + fileName + strconv.Itoa(i) + ".json")
if err == nil { //如果文件存在
fmt.Println("文件: " + fileName + strconv.Itoa(i) + ".json " + "已存在")
continue
}
fileObj, _ = os.OpenFile("./"+fileName+strconv.Itoa(i)+".json", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
defer fileObj.Close()
// 获取writer对象
writer := bufio.NewWriter(fileObj)
writer.WriteString(content + "\n")
// 刷新缓冲区,强制写出
writer.Flush()
fmt.Println("文件创建成功,文件名: " + fileName + strconv.Itoa(i) + ".json ")
break
}
}
本文介绍了一个使用Go语言进行JSON文件操作的简单程序,包括创建、添加和查询JSON文件等功能。通过命令行输入不同的指令来完成对JSON文件的管理。

被折叠的 条评论
为什么被折叠?



