草庐IT

json - 嵌套的 Go Structs,用于带有可选结构的 JSON 编码(marshal)处理

coder 2023-07-01 原文

我正在尝试初始化一个嵌套结构,然后将其编码到 json 中以获得 API 响应。我遇到的挑战是其中一个组件(结构的一部分)可以有 n 个成员,但可以是两种可能类型(文本、图像)中的一种。

我要创建的 JSON 如下所示:

{
  "messages": [
    {
      "message_parts": [
        {
          "text": {
            "content": "dfdffd"
          }
        },
        {
          "image": {
            "url": "https://image.jpg"
          }
        }
      ],
      "actor_id": "44444444",
      "actor_type": "agent"
    }
  ],
  "channel_id": "44444444",
  "users": [
    {
      "id": "44444444"
    }
  ]
}

在 message_parts slice 中,它可以至少包含文本或图像之一,但也可能包含两者之一。

我的结构目前看起来像这样:

   Type messagePayload struct {
        Messages  []Messages `json:"messages"`
        Status    string     `json:"status,omitempty"`
        ChannelID string     `json:"channel_id"`
        Users     []Users    `json:"users"`
    }
    type Messages struct {
        MessageParts []MessageParts `json:"message_parts"`
        ActorID      string         `json:"actor_id"`
        ActorType    string         `json:"actor_type"`
    }

    type Users struct {
        ID string `json:"id"`
    }
    type Text struct {
        Content string `json:"content,omitempty"`
    }
    type MessageParts struct {
        Text  *Text  `json:"text,omitempty"`
        Image *Image `json:"image,omitempty"`
    }
    type Image struct {
        URL string `json:"url,omitempty"`
    }

如果它们不存在,我真的很难以一种不会出现在 json 中的方式对其进行初始化。

这是我现在所在的位置,但它显然不起作用:

payload := &messagePayload{
    Messages: []Messages{
        {
            MessageParts: []MessageParts{
                {
                    &Text{
                        Content: text,
                    },
                },
                {
                    &Image{
                        URL: mediaurl,
                    },
                },
            },
            ActorID:   agentID,
            ActorType: "agent",
        }},
    ChannelID: channelid,
    Users: []Users{
        {
            ID: user,
        },
    },
}

编辑: 感谢下面的提示和其他一些发现,我发现最好的方法是初始化有效负载,然后根据需要添加文本和图像的 slice : https://play.golang.org/p/Pmmv00spcI6

最佳答案

如上所述,我找到了一个解决方案 - 您需要在没有文本或图像数据的情况下初始化有效负载,然后将它们附加到 MessageParts slice :

package main

import (
    "encoding/json"
    "fmt"
)

type messagePayload struct {
    Messages  []Messages `json:"messages"`
    Status    string     `json:"status,omitempty"`
    ChannelID string     `json:"channel_id"`
    Users     []Users    `json:"users"`
}
type Messages struct {
    MessageParts []MessageParts `json:"message_parts"`
    ActorID      string         `json:"actor_id"`
    ActorType    string         `json:"actor_type"`
}

type Users struct {
    ID string `json:"id"`
}
type Text struct {
    Content string `json:"content,omitempty"`
}
type MessageParts struct {
    Text  *Text  `json:"text,omitempty"`
    Image *Image `json:"image,omitempty"`
}
type Image struct {
    URL string `json:"url,omitempty"`
}

func main() {

    payload := &messagePayload{
        Messages: []Messages{
            {
                MessageParts: []MessageParts{

                },
                ActorID:   "id",
                ActorType: "agent",
            }},
        ChannelID: "cid",
        Users: []Users{
            {
                ID: "user1",
            },
        },
    }
    var text= new(MessageParts)
    text.Text = &Text{Content: "LOL"}
        var image = new(MessageParts)
        image.Image= &Image{URL: "https://"}
    payload.Messages[0].MessageParts = append(payload.Messages[0].MessageParts, *text)
    payload.Messages[0].MessageParts = append(payload.Messages[0].MessageParts, *image)
    m, err := json.Marshal(payload)
    if err != nil {
        fmt.Println("Error, ", err)
        return
    }
    fmt.Println(string(m))
}

关于json - 嵌套的 Go Structs,用于带有可选结构的 JSON 编码(marshal)处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589890/

有关json - 嵌套的 Go Structs,用于带有可选结构的 JSON 编码(marshal)处理的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

随机推荐