
本文介绍了一种在Go语言中处理包含非JSON内容的JSON流的方法。当从标准输入或其他来源接收到的JSON数据流中夹杂着非JSON字符串时,标准的`encoding/json`包会报错。本文提供了一种解决方案,通过读取字节切片、裁剪非JSON字符串并使用`json.Unmarshal`进行反序列化,从而有效地解析这类数据流。
在Go语言中处理JSON数据流时,如果数据流中包含非JSON内容,标准的encoding/json包提供的解码器可能会遇到问题。一个常见的场景是,JSON结构体之间穿插着特定的分隔符或标记,例如示例中的"end"字符串。这种情况下,直接使用json.Decoder会因为无法解析非JSON内容而报错。
以下提供一种解决方案,该方案的核心思想是:不使用json.Decoder,而是直接从输入流中读取字节切片,然后手动裁剪掉非JSON部分,最后使用json.Unmarshal将剩余的JSON数据反序列化为Go结构体。
实现步骤
读取字节切片: 使用os.Stdin.Read()从标准输入读取数据到一个字节切片中。需要预先分配足够大的字节切片来容纳可能的数据。
裁剪非JSON内容: 使用bytes.Index()函数查找JSON数据和非JSON内容之间的分隔符。根据分隔符的位置,裁剪字节切片,只保留JSON数据部分。
反序列化JSON: 使用json.Unmarshal()函数将裁剪后的JSON数据反序列化为Go结构体。
里面有2个文件夹。其中这个文件名是:finishing,是我项目还没有请求后台的数据的模拟写法。请求后台数据之后,瀑布流的js有一点点变化,放在文件名是:finished。变化在于需要穿参数到后台,和填充的内容都用后台的数据填充。看自己项目需求来。由于chrome模拟器是不允许读取本地文件json的,所以如果你要进行测试,在hbuilder打开项目就可以看到效果啦,或者是火狐浏览器。
92
示例代码
package main
import (
"bytes"
"encoding/json"
"fmt"
"os"
)
// MyStruct 定义JSON对应的结构体
type MyStruct struct {
Command string `json:"command"`
ID string `json:"id"`
Msg string `json:"msg,omitempty"` //omitempty表示如果Msg为空,则在JSON中不显示该字段
}
func main() {
// 创建一个缓冲区来保存流数据
data := make([]byte, 5000)
var err error
// 从stdin循环读取数据
for {
_, err = os.Stdin.Read(data)
if err != nil {
fmt.Println("Error reading from stdin:", err)
return // 或者使用 panic(err)
}
// 找到第一个换行符的索引
index := bytes.Index(data, []byte("\n"))
if index == -1 {
fmt.Println("No newline found, skipping")
continue // 或者返回错误
}
data = data[:index]
// 创建 MyStruct 类型的变量
var myStruct MyStruct
err = json.Unmarshal(data, &myStruct)
if err != nil {
fmt.Println("Error unmarshalling JSON:", err)
continue // 或者返回错误
}
// 使用 myStruct 做一些事情
fmt.Printf("Received: %+v\n", myStruct)
// 重置 data,准备读取下一个 JSON
data = make([]byte, 5000)
}
}代码解释
注意事项
总结
该方法提供了一种在Go语言中处理包含非JSON内容的JSON流的有效解决方案。通过手动读取和裁剪数据,可以绕过标准json.Decoder的限制,成功解析这类数据流。但是,在实际应用中需要注意错误处理、缓冲区大小、分隔符以及性能等问题,并根据具体情况进行相应的调整和优化。
以上就是处理Go中JSON流中的非JSON内容的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号