草庐IT

go - 重复 formData 到 Go 结构

coder 2024-07-07 原文

我正在提交一个重复表单,其中生成的 formData 被解析为:

"Name":  {"John", "Jake"},
"Phone": {"999-999-999", "12312-123-123"}, 

但是,我想构造成

{ Name: "John", Phone: "999-999-999" }, 
{ Name: "Jake", Phone: "12312-123-123" }.

有人告诉我gorilla/schema , 很合适,但我在下面尝试了它,它产生了一个空 slice 。有什么我想念的吗?

package main

import (
        "fmt"

        "github.com/gorilla/schema"
)

type Person struct {
        Name  string
        Phone string
}

func main() {
        values := map[string][]string{
                "Name":  {"John", "Jake"},
                "Phone": {"999-999-999", "12312-123-123"},
        }
        var persons []Person
        decoder := schema.NewDecoder()
        decoder.Decode(persons, values)
        fmt.Println(persons)
}

最佳答案

在您提供的 json 数据中,每个键包含两个值。这就是空 slice 背后的原因。在结构中使用字符串片段来解码值。

package main

import (
    "fmt"

    "github.com/gorilla/schema"
)

type Person struct {
    Name  []string // this should be a slice since the key contains multiple values
    Phone []string
}

type Person2 struct {
    Name  string
    Phone string
}

func main() {
    values := map[string][]string{
        "Name":  {"John", "Jake"},
        "Phone": {"999-999-999", "12312-123-123"},
    }
    person := new(Person)
    decoder := schema.NewDecoder()
    decoder.Decode(person, values)
    fmt.Println(person)
}

输出:

&{[John Jake] [999-999-999 12312-123-123]}

对于所需的结构

{ Name: "John", Phone: "999-999-999" }, 
{ Name: "Jake", Phone: "12312-123-123" }

已编辑:

处理来自表单的数据以更改结构的格式。

type Person2 struct {
    Name  string
    Phone string
}

func processData(person *Person) {
    var result []Person2
    var person2 Person2
    for i := 0; i < len(person.Name); i++ {
        person2.Name = person.Name[i]
        person2.Phone = person.Phone[i]
        result = append(result, person2)
    }
    fmt.Printf("%#v\n", result)
}

输出:

[]stack.Person2{stack.Person2{Name:"John", Phone:"999-999-999"}, stack.Person2{Name:"Jake", Phone:"12312-123-123"}}

Playground Example处理数据

正如@Adrain 所建议的,最好对表单的字段名称使用某种索引。它也在 gorilla/schema 中提供包以命名带有索引的值以保存多条记录。

<form>
    <input type="text" name="Name">
    <input type="text" name="Phones.0.Label">
    <input type="text" name="Phones.0.Number">
    <input type="text" name="Phones.1.Label">
    <input type="text" name="Phones.1.Number">
    <input type="text" name="Phones.2.Label">
    <input type="text" name="Phones.2.Number">
</form>

上面的表单可以解析为下面的结构,其中包含一段电话:

type Person struct {
    Name   string
    Phones []Phone
}

关于go - 重复 formData 到 Go 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51592161/

有关go - 重复 formData 到 Go 结构的更多相关文章

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

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

  2. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  3. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  4. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  5. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","

  6. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  7. Ruby 从数组中删除重复的对象 - 2

    我无法使用传统的Ruby方法从下面的数组user_list中删除所有重复对象,从而获得预期的结果。有解决这个问题的聪明方法吗?users=[]user_list.eachdo|u|user=User.find_by_id(u.user_id)users 最佳答案 这个怎么样?users=User.find(user_list.map(&:user_id).uniq)这具有作为一个数据库调用而不是user_list.size数据库调用的额外好处。 关于Ruby从数组中删除重复的对象,我们在

  8. Ruby 删除可枚举列表中的重复项 - 2

    ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h

  9. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  10. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

随机推荐