Ruby序列化数据结构
我试图从Ruby序列化一个复杂的JSON结构。我没有使用Rails,但我对Ruby很新,所以我不确定这在这里是否重要。 另一端的API预期会出现类似的情况Ruby序列化数据结构,ruby,json,serialization,Ruby,Json,Serialization,我试图从Ruby序列化一个复杂的JSON结构。我没有使用Rails,但我对Ruby很新,所以我不确定这在这里是否重要。 另一端的API预期会出现类似的情况 { "command" : { "param" : { "field" : "val", "otherField":"otherVal" }, "param" : { "field" : "val", "otherField":"otherVal" }, "param" : { "field" : "val", "other
{ "command" : {
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" }
}
}
在序列化之前,command持有什么类型的ruby对象?它不是一个数组,因为会有另一个方括号级别(参见下面的示例)。我是ruby新手,但也不要认为一个哈希中可以有多个同名的对象
背景故事:由于哈希和数组在Ruby中以其他方式序列化为json的效果非常好,所以我期待类似这样的结果:
Ary = Array.new
Ary.push (param.new)
Ary.push (param.new)
Ary.push (param.new)
wrappedCmd = { "command" => Ary }
Oj.dump(wrappedCmd)
但这会产生:
{ "command" : [
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" }
]
}
我已经确认,第一种格式是预期的格式,因为手动构造的序列化会进行,而第二种格式会产生无效的格式错误 区别在于第一个包含哈希,第二个包含数组。因此,您应该这样做:
cmd = {}
cmd['param1'] = Param.new
cmd['param2'] = Param.new
cmd['param3'] = Param.new
Oj.dump("command" => cmd)
实际上,散列不能有重复的键名。听起来您的API没有使用正确的JSON?如果您尝试解析初始JSON字符串,会发生以下情况:
require 'json'
foo = JSON['{ "command" : {
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" }
}
}']
foo # => {"command"=>{"param"=>{"field"=>"val", "otherField"=>"otherVal"}}}
所以,我们知道这是无效的。我怀疑JSON仅仅是一个写得很差的示例。由于继续发送相同的“param”
是没有意义的,因此这些参数名称应该不同
关于您的代码:它不是惯用的Ruby
Ary = Array.new
Ary.push (param.new)
Ary.push (param.new)
Ary.push (param.new)
wrappedCmd = { "command" => Ary }
甚至:
wrapped_cmd = {
"command" => [
param.new,
param.new,
param.new,
]
}
- 常量以大写字母开头,变量以小写字母开头,因此请使用
而不是ari
ari
- 通常,我们使用
来初始化空数组,而不是[]
。这是一个可读性的东西数组。新建
- 通常我们使用的
在语义上是无效的JSON,如果所有的键都是字面上的“param”,那么API就会被破坏。键不可能在映射中重复(例如JSON对象或Ruby哈希)。确保所说的无效JSON确实是“正确的”。(而且没有一个合适的JSON库允许发出这样的错误标记。)嗯,好的。对API端没有任何控制,它接受第一种格式。谢谢。但是这不会产生:{“command”:param1:stuff,param2:stuff,param3:stuff}当然不会。至少,对于标准JSON serialiser来说不是这样。我认为问题的根源在于这个API接受的不是正确的JSON。“param”是玩具问题,但它确实期望同一字段重复3次。看起来有人采用了一种旧的XML格式并尝试将其转换为json,在这种情况下,第二种格式既正常又合理。因为我们完全不知道OP所说的API是什么,所以我们完全是瞎猜,一切都是猜测。对外部(非Ruby)系统的专有调用需要字符串。字符串被记录为json文本,看起来像原始帖子,有一堆重复的参数,缺少一些数组括号。作为ruby新手,我认为这是我以前从未遇到过的json构造。不在黑暗中射击,对问题的回答很拘束。
ary = [ param.new, param.new, param.new, ] wrapped_cmd = { "command" => ary }
wrapped_cmd = { "command" => [ param.new, param.new, param.new, ] }