unmarshal _id到id不会工作

时间:2017-09-10 20:18:03

标签: json mongodb go

所以我的结构看起来像这样:

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"

值将正常返回(将返回db的实际_id值)

我想知道如何避免这种情况(但我仍然需要使用json.Unmarshal)

1 个答案:

答案 0 :(得分:0)

  • 在您的文章结构中解组,但标记为json:"_id"
  • 只有标签不同的两种结构类型可以相互转换。因此,一种解决方案是创建另一个ArticleBis类型,而不是标记json:"id"。然后将文章转换为Article Mars实例,即Marshal。

另一个简单的例子:

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))
}