golang简单高效的JSON读写处理插件库jsonhandlers的使用

Golang简单高效的JSON读写处理插件库jsonhandlers的使用

Json Handlers

Jsonhandlers是一个提供简单处理程序的JSON库,可以让你轻松地从各种来源读取和写入JSON。

安装

go get github.com/abusomani/jsonhandlers

使用

Go的import语句的一个非常有用的特性是别名。导入别名的一个常见用例是为库的包名提供更短的替代方案。

在这个例子中,我们使用jh代替每次调用库函数时输入jsonhandlers

import (
    jh "github.com/abusomani/jsonhandlers"
)

选项

Jsonhandlers包在创建新的jsonhandler时公开了多个选项,以便能够从文件、HTTP请求或HTTP响应等来源读取/写入JSON。

WithFileHandler

你可以使用WithFileHandler选项从文件读取/写入JSON。为此,你需要使用文件处理程序选项创建一个新的jsonhandler。

示例代码

package operations

import (
	"fmt"

	"github.com/abusomani/jsonhandlers"
)

func handleFile() {
	jh := jsonhandlers.New(jsonhandlers.WithFileHandler(testFilePath))

	var sch school
	err := jh.Unmarshal(&sch)
}

WithHTTPRequestHandler

你可以使用WithHTTPRequestHandler选项从HTTP请求读取JSON并向HTTP ResponseWriter写入JSON。为此,你需要使用HTTP请求处理程序选项创建一个新的jsonhandler。

示例代码

package operations

import (
	"net/http"

	"github.com/abusomani/jsonhandlers"
)

type studentSearchRequest struct {
	Name string
}

type studentSearchResponse struct {
	Info student
}

func HandleHTTPRequest(students []student) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		
    	jh := jsonhandlers.New(jsonhandlers.WithHTTPRequestHandler(w, r))

		var reqBody studentSearchRequest
		_ := jh.Unmarshal(&reqBody)
		

		for _, student := range students {
			// student found
			if student.Name == reqBody.Name {
				
				// write the response using jh.Marshal
				jh.Marshal(studentSearchResponse{
					Info: student,
				})
				return
			}
		}
	})
}

/*
  Sample request to be hit on the localhost server to test WithHTTPRequestHandler functionality.
  curl http://localhost:8080/search -d '{"Name": "Abhishek Somani"}'
*/

WithHTTPResponseHandler

你可以使用WithHTTPResponseHandler选项从HTTP响应读取/写入JSON。为此,你需要使用HTTP响应处理程序选项创建一个新的jsonhandler。

示例代码

package operations

import (
	"fmt"
	"log"
	"net/http"

	"github.com/abusomani/jsonhandlers"
)

type user struct {
	Id        int
	FirstName string
	LastName  string
}

type getUsersResponse struct {
	Users []user
}

func HandleHTTPResponse() {
	resp, _ := http.Get("https://dummyjson.com/users")
	jh := jsonhandlers.New(jsonhandlers.WithHTTPResponseHandler(resp))

	var userResp getUsersResponse
	jh.Unmarshal(&userResp)
}

运行示例

要运行示例文件夹中的示例,你需要首先通过执行git clone检出这个包。一旦你检出了这个包,你就可以使用以下命令运行main.go来查看所有示例的运行情况:

go run example/main.go

许可证

根据MIT许可证授权


更多关于golang简单高效的JSON读写处理插件库jsonhandlers的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的JSON读写处理插件库jsonhandlers的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang JSON处理库jsonhandlers简介

jsonhandlers是一个简单高效的Golang JSON处理库,它提供了比标准库更便捷的API来处理JSON数据。下面我将介绍它的主要功能和使用方法。

安装

go get github.com/jsonhandlers/jsonhandlers

基本用法

1. 解析JSON

package main

import (
	"fmt"
	"github.com/jsonhandlers/jsonhandlers"
)

func main() {
	jsonStr := `{"name":"Alice","age":25,"isStudent":true,"courses":["math","physics"]}`

	// 解析JSON字符串
	handler, err := jsonhandlers.NewJsonHandlerFromString(jsonStr)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 获取字段值
	name, _ := handler.GetString("name")
	age, _ := handler.GetInt("age")
	isStudent, _ := handler.GetBool("isStudent")
	courses, _ := handler.GetStringSlice("courses")

	fmt.Printf("Name: %s, Age: %d, IsStudent: %v\n", name, age, isStudent)
	fmt.Println("Courses:", courses)
}

2. 创建JSON

package main

import (
	"fmt"
	"github.com/jsonhandlers/jsonhandlers"
)

func main() {
	// 创建新的JSON处理器
	handler := jsonhandlers.NewJsonHandler()

	// 设置字段值
	handler.Set("name", "Bob")
	handler.Set("age", 30)
	handler.Set("isEmployee", true)
	handler.Set("skills", []string{"Go", "Python", "JavaScript"})

	// 转换为JSON字符串
	jsonStr, err := handler.ToString()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Generated JSON:", jsonStr)
}

高级功能

1. 嵌套JSON处理

package main

import (
	"fmt"
	"github.com/jsonhandlers/jsonhandlers"
)

func main() {
	jsonStr := `{
		"user": {
			"name": "Charlie",
			"address": {
				"city": "New York",
				"zip": "10001"
			}
		}
	}`

	handler, _ := jsonhandlers.NewJsonHandlerFromString(jsonStr)

	// 获取嵌套字段
	userName, _ := handler.GetString("user.name")
	city, _ := handler.GetString("user.address.city")

	fmt.Printf("User: %s, City: %s\n", userName, city)

	// 修改嵌套字段
	handler.Set("user.address.zip", "10002")
	updatedJson, _ := handler.ToString()
	fmt.Println("Updated JSON:", updatedJson)
}

2. 数组处理

package main

import (
	"fmt"
	"github.com/jsonhandlers/jsonhandlers"
)

func main() {
	jsonStr := `{
		"products": [
			{"id": 1, "name": "Laptop", "price": 999.99},
			{"id": 2, "name": "Mouse", "price": 19.99}
		]
	}`

	handler, _ := jsonhandlers.NewJsonHandlerFromString(jsonStr)

	// 获取数组长度
	count, _ := handler.GetArrayCount("products")
	fmt.Println("Product count:", count)

	// 获取数组元素
	firstProduct, _ := handler.GetJsonHandler("products.0")
	firstName, _ := firstProduct.GetString("name")
	firstPrice, _ := firstProduct.GetFloat64("price")
	fmt.Printf("First product: %s ($%.2f)\n", firstName, firstPrice)

	// 添加新元素
	newProduct := jsonhandlers.NewJsonHandler()
	newProduct.Set("id", 3)
	newProduct.Set("name", "Keyboard")
	newProduct.Set("price", 49.99)
	handler.AppendToArray("products", newProduct)

	updatedJson, _ := handler.ToString()
	fmt.Println("Updated products:", updatedJson)
}

性能优化

jsonhandlers在性能上做了优化,特别是在处理大型JSON数据时:

  1. 延迟解析:只有在实际访问字段时才进行解析
  2. 内存复用:减少内存分配和垃圾回收压力
  3. 缓存机制:缓存已解析的字段路径

与标准库对比

相比标准库的encoding/json,jsonhandlers提供了:

  1. 更简洁的API
  2. 路径式访问(如user.address.city
  3. 更灵活的类型转换
  4. 更方便的JSON构建方式
  5. 更好的错误处理

总结

jsonhandlers是一个非常适合日常JSON处理的Golang库,它简化了JSON的读写操作,同时保持了高性能。对于需要频繁处理JSON数据的应用,它可以帮助开发者编写更简洁、更易维护的代码。

注意:jsonhandlers并非官方库,使用前请评估其稳定性和社区支持情况。对于关键任务应用,标准库encoding/json仍然是更稳妥的选择。

回到顶部