json - Golang 将 2 个 JSON 项解码为 1 个结构

标签 json parsing go

我正在尝试将 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/

相关文章:

java - 将一维 JSON 数组解析为普通数组

C++ SQLite 返回一些值?

regex - csv格式是正规文法还是上下文无关文法?

go - 如何设置和解析正文请求中的时间?

html - 如何在 angularjs 中为表单字段生成 json 数据

javascript - json 到 javascript - 谷歌图表

sql - 错误: "Argument data type float is invalid for argument 1 of parse function." when doing try_parse() in SQL

forms - 从表单导入 CSV 文件并使用 GO 解析结果

json - 从 Map 和 Struct 编码的 JSON 中的排序差异

python - 如何自定义排序要在 json.dumps 中使用的字典列表