英文:
Unmarshal _id to id wont work
问题
我的结构如下:
type Article struct {
ID bson.ObjectId `json:"id" bson:"_id,omitempty"`
LangCode string `json:"langCode" bson:"langCode"`
AuthorId string `json:"authorId" bson:"authorId"`
AuthorName string `json:"authorName" bson:"authorName"`
ArticleType int64 `json:"type" bson:"type"`
Title string `json:"title" bson:"title"`
Intro string `json:"intro" bson:"intro"`
Body string `json:"body" bson:"body"`
MainPic string `json:"mainPic" bson:"mainPic"`
Tags string `json:"tags" bson:"tags"`
Slug string `json:"slug" bson:"slug"`
DateAdded time.Time `json:"dateAdded" bson:"dateAdded"`
Status int64 `json:"status" bson:"status"`
}
以下是代码片段:
pageReturn.Pagination = resultsList.Pagination
err = json.Unmarshal(resultsList.Results, &pageReturn.Articles)
这样返回的数据将不包含数据库中的 _id
值(也就是说,在 JSON 字符串中,id
的值将为空字符串)。
如果我将 ID bson.ObjectId
json:"id" bson:"_id,omitempty"改为
ID bson.ObjectId json:"_id" bson:"_id,omitempty"
,则会正常返回值(将返回数据库中实际的 _id
值)。
我想知道如何避免这种情况(但我仍然需要使用 json.Unmarshal
)。
英文:
So my structure looks like this:
type Article struct {
ID bson.ObjectId `json:"id" bson:"_id,omitempty"`
LangCode string `json:"langCode" bson:"langCode"`
AuthorId string `json:"authorId" bson:"authorId"`
AuthorName string `json:"authorName" bson:"authorName"`
ArticleType int64 `json:"type" bson:"type"`
Title string `json:"title" bson:"title"`
Intro string `json:"intro" bson:"intro"`
Body string `json:"body" bson:"body"`
MainPic string `json:"mainPic" bson:"mainPic"`
Tags string `json:"tags" bson:"tags"`
Slug string `json:"slug" bson:"slug"`
DateAdded time.Time `json:"dateAdded" bson:"dateAdded"`
Status int64 `json:"status" bson:"status"`
}
And following snippet:
pageReturn.Pagination = resultsList.Pagination
err = json.Unmarshal(resultsList.Results, &pageReturn.Articles)
Will return data without value _id from database (I mean in json string id will be equal to "")
If I change ID bson.ObjectId json:"id" bson:"_id,omitempty"
to ID bson.ObjectId json:"_id" bson:"_id,omitempty"
value will be returned normally (actual _id value from db will be returned)
I'm wondering how can I avoid this (but I still need to use json.Unmarshal)
答案1
得分: 1
- 使用标签
json:"_id"
将其解组为您的Article结构体。 - 只有标签不同的两个结构体类型可以相互转换。因此,一种解决方案是创建另一个ArticleBis类型,其标签为
json:"id"
。然后,将您的article转换为ArticleBis实例,再进行编组。
另一个简单的示例:
package main
import "fmt"
import "encoding/json"
type Base struct {
Firstname string `json:"first"`
}
type A struct {
Base
Lastname string `json:"last"`
}
type B struct {
Base
Lastname string `json:"lastname"`
}
func main() {
john := A{Base: Base{Firstname: "John"}, Lastname: "Doe"}
john1 := B(john)
john_json, _ := json.Marshal(john)
john1_json, _ := json.Marshal(john1)
fmt.Println(string(john_json))
fmt.Println(string(john1_json))
}
请注意,以上代码是用于演示目的的简化示例,以说明如何在结构体之间进行转换和编组。
英文:
- Unmarshal into your Article struct, but with tag
json:"_id"
- two struct types that only differ by tags can be converted to each other. So one solution is to create another ArticleBis type, with tag
json:"id"
instead. Then you convert your article to an ArticleBis instance, which you Marshal.
Another simple example:
<!-- language: lang-go -->
package main
import "fmt"
import "encoding/json"
type Base struct {
Firstname string `json:"first"`
}
type A struct {
Base
Lastname string `json:"last"`
}
type B struct {
Base
Lastname string `json:"lastname"`
}
func main() {
john := A{Base: Base{Firstname: "John"}, Lastname:"Doe"}
john1 := B(john)
john_json, _ := json.Marshal(john)
john1_json, _ := json.Marshal(john1)
fmt.Println(string(john_json))
fmt.Println(string(john1_json))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论