通常我们在 Go 中解码一个 json 对象:
我是 Go 的菜鸟,所以如果下面的某些语法似乎不正确,请原谅我。
type Item struct {
Quantity int `json:"quantity,omitempty"`
Price float64 `json:"price,omitempty"`
Currency string `json:"currency,omitempty"`
}
output := &Item{}
err:= json.Unmarshal([]byte(data), output)
现在问题是我的 json 在运行时可能会因某些字段而异。价格可以是字符串、具有不同值的数组或在一个对象中包含货币和价格的 json。
我在数据库中有这个映射,我如何编写代码才能读取列名到类型的映射,然后解码它以在运行时创建合适的结构。例如我需要在同一代码中解码以下 JSON:-
{"Quantity": 5, "Price": 64.5, "Currency": "USD"}
{"Quantity": 5, "Purchase": {"Price": 64.5, "Currency": "USD"}}
对于数据库中的第二个 json,我已经有了像 Quantity -> int, Purchase -> JSON String 这样的映射。
tl;dr
需要解码 json,其中结构在运行时根据某些参数发生变化,我事先知道结构
编辑:改写
我需要一个函数,它会返回上面结构的对象,将 json 字符串和 json 格式字符串作为输入。
CustomUnmarshal([]byte(data) []byte, format string) (*item){}
我在这里写了一个示例代码:-
最佳答案
如果您的输出结构和输入中的键保持不变,则可以使用 Unmarshaler 接口(interface)执行您需要的操作。
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
我实现了一个非常粗糙的、只有字符串的结构实现。
type Item struct {
Quantity string `json:"quantity,omitempty"`
Price string `json:"price,omitempty"`
Currency string `json:"currency,omitempty"`
}
就像我说的那样,它非常粗糙,有很多假设并且没有检查到位。
func (itm *Item) UnmarshalJSON(byt []byte) (err error) {
jsn := string(byt)
jsn = strings.Replace(jsn,"{","",-1)
jsn = strings.Replace(jsn,"}","",-1)
jsnArr := strings.Split(jsn,":")
fmt.Println(jsnArr)
for i, val := range jsnArr {
switch {
case strings.Contains(val,"Quantity"):
itm.Quantity = strings.Split(jsnArr[i+1],",")[0]
case strings.Contains(val,"Price"):
itm.Price = strings.Split(jsnArr[i+1],",")[0]
case strings.Contains(val,"Currency"):
itm.Currency = strings.Split(jsnArr[i+1],",")[0]
}
}
return
}
另请注意,您为结构设置的 json 标记表示 json 输入键应该如何,所以像 "Quantity" 这样的键应该是 "quantity" JSON 输入等。
关于go - 在运行时确定结构时进行 JSON Unmarshal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40145706/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/