如何将JSON字符串插入MongoDB?Go代码报错解决方法
解决方法
问题根源
- 你传入的JSON字符串外层多了一对双引号,属于格式错误,不是合法的JSON对象。
- MongoDB Go驱动的
InsertOne方法不接受原始字符串作为文档参数,需要传入可序列化为BSON的类型(比如bson.M、结构体或[]byte形式的JSON)。
修正步骤
步骤1:修复原始JSON字符串
把外层的双引号去掉,得到合法的JSON对象:
{"http_requests":[{"http_requests":{"code":"400","method":"PUT","value":89}},{"http_requests":{"code":"200","method":"PUT","value":45}}]}
步骤2:修改Go代码
将JSON字符串解析为bson.M(或直接使用[]byte),再传入InsertOne:
import ( "context" "fmt" "log" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func insertJson(json_value string) { client, err := mongo.NewClient(options.Client().ApplyURI("mongodb+srv://abc:123@cluster0.wrzj3zo.mongodb.net/?retryWrites=true&w=majority")) if err != nil { log.Fatal(err) } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() // 避免context资源泄漏 err = client.Connect(ctx) if err != nil { log.Fatal(err) } defer client.Disconnect(ctx) myDatabase := client.Database("my_db") myCollection := myDatabase.Collection("my_collection") // 方法1:将JSON字符串解析为bson.M,可提前校验格式 var doc bson.M err = bson.UnmarshalExtJSON([]byte(json_value), true, &doc) if err != nil { log.Fatal(err) } // 方法2:直接传入[]byte,驱动内部自动完成转换 // doc := []byte(json_value) myResult, err := myCollection.InsertOne(ctx, doc) if err != nil { log.Fatal(err) } fmt.Println(myResult.InsertedID) }
关键说明
bson.UnmarshalExtJSON的第二个参数true表示支持MongoDB扩展JSON格式,适配特殊语法。- 解析为
bson.M能提前发现JSON格式错误,避免插入时失败。 - 必须调用
cancel()释放context资源,防止内存泄漏。
内容的提问来源于stack exchange,提问作者Rachel A
相关产品推荐
相关产品推荐

