我正在尝试将 2 个 JSON 项解码为相同的结构,因为第二个 JSON 完成了第一个,但它不起作用(什么都不做)你有什么想法吗?
func getUserClip(this *LibraryController, id string) (*Clip){
//Test Api
//Send Request to azure search
Data := Clip{}
if req := GetClipById("b373400a-bd7e-452a-af68-36992b0323a5"); req == nil {
return nil
} else {
str, err := req.String()
if err != nil {
beego.Debug("Error Json req.String: ", err)
}
//Uncode Json to string
if err := json.Unmarshal([]byte(str), &Data); err != nil {
beego.Debug("Error json", err)
}
for i := range Data.Value {
if req = GetCliRedis(Data.Value[i].Id); err != nil {
return nil
} else {
str, err := req.String()
beego.Debug("JSON REDIS DEBUG: ", str)
if err != nil {
beego.Debug("Error Json req.String: ", err)
}
if err := json.Unmarshal([]byte(str), &Data); err != nil {
beego.Debug("Error json", err)
}
}
i++
}
}
return &Data
}
和结构
type Clip struct {
Value []InfoClip `json:value`
}
type InfoClip struct {
Id string `json:id`
CreatedAt time.Time `json:createdAt`
StartTimeCode int `json:startTimeCode`
EndTimeCode int `json:endTimeCode`
Metas metas `json:metas`
Tags []string `json:tags`
Categories []string `json:categories`
UserId string `json:userId`
SourceId string `json:sourceId`
ProviderName string `json:providerName`
ProviderReference string `json:providerReference`
PublicationStatus string `json:publicationStatus`
Name string `json:name`
FacebookPage string `json:facebookPage`
TwitterHandle string `json:twitterHandle`
PermaLinkUrl string `json:permalinkUrl`
Logo string `json:logo`
Link string `json:link`
Views int `json:views`
}
type metas struct {
Title string `json:title`
Tags []string `json:tags`
Categories []string `json:categories`
PermaLink string `json:permalink`
}
我收到的 JSON 是:
{
"clipId":"9b2ea9bb-e54b-4291-ba16-9211fa3c755f",
"streamUrl":"https://<edited out>/asset-32e43a5d-1500-80c3-cc6b-f1e4fe2b5c44\/6c53fbf5-dbe9-4617-9692-78e8d76a7b6e_H264_500kbps_AAC_und_ch2_128kbps.mp4?sv=2012-02-12&sr=c&si=17ed71e8-5176-4432-8092-ee64928a55f6&sig=KHyToRlqvwQxWZXVvRYOkBOBOF0SuBLVmKiGp4joBpw%3D&st=2015-05-18T13%3A32%3A41Z&se=2057-05-07T13%3A32%3A41Z",
"startTimecode":"6",
"endTimecode":"16",
"createdAt":"2015-05-19 13:31:32",
"metas":"{\"title\":\"Zapping : Obama, Marine Le Pen et Michael Jackson\",\"tags\":[\"actualite\"],\"categories\":[\"actualite\"],\"permalink\":\"http:\/\/videos.lexpress.fr\/actualite\/zapping-obama-marine-le-pen-et-michael-jackson_910357.html\"}",
"sourceId":"6c53fbf5-dbe9-4617-9692-78e8d76a7b6e",
"providerName":"dailymotion",
"providerReference":"x1xmnxq",
"publicationStatus":"1",
"userId":"b373400a-bd7e-452a-af68-36992b0323a5",
"name":"LEXPRESS.fr",
"facebookPage":"https:\/\/www.facebook.com\/LExpress",
"twitterHandle":"https:\/\/twitter.com\/lexpress",
"permalinkBaseURL":"https:\/\/tym.net\/fr\/{CLIP_ID}",
"logo":"lexpress-120px.png",
"link":"http:\/\/videos.lexpress.fr\/"
}
Redis 完成 azure 搜索缺失信息:
这里是结构体:
type Clip struct {
Value []SearchClip `json:value`
}
type SearchClip struct {
Id string `json:id`
CreatedAt string`json:createdAt`
Tags []string `json:tags`
Categories []string `json:categories`
UserId string `json:userId`
SourceId string `json:sourceId`
Views int `json:views`
}
这是基本信息,redis完成了
我不想将 2 个结构合并到第三个结构中,我认为这不是更好的过程,如果这是最后一个解决方案,我会这样做。
最佳答案
由于缺乏事件,我将发布嵌入选项作为解决方案。这可能是做您想做的事情的最简单方法。
type ClipInfoAndMeta struct {
Metas
InfoClip
}
请注意,我在 metas
上将名称大写了,不确定是否有必要,但我相信这是必要的。这里使用的语言特性称为“嵌入”,它的工作方式很像组合,只是嵌入类型的字段/方法或多或少“提升”到包含类型范围。使用 ClipInfoAndMeta
实例的 IE,您可以直接访问在 InfoClip
上定义的任何导出字段。
您设置的一个奇怪之处是您将在两种类型之间的字段名称上发生冲突。不确定结果如何。综上所述,查看您尝试从中解码的 json 字符串会很有帮助。在撰写本文时,我意识到 metas
只是 InfoClip
的一个子集。哪个让我对您实际尝试做的事情感到困惑?我的意思是,如果返回的数据全部在一个对象中,则意味着 InfoClip
足以存储所有数据。如果是这种情况,您没有理由使用其他对象......如果您想减少传递到应用程序显示层的字段,您应该只在 InfoClip
上定义一个方法> 像 func (i *InfoClip) GetMetas() Metas { return &Metas{ ... } }
这样你就可以在任何地方处理一个类型并交出 Metas
在需要时显示层。
关于json - Golang 将 2 个 JSON 项解码为 1 个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33255821/