【发布时间】:2014-09-07 09:10:45
【问题描述】:
我正在尝试从 Ruby 序列化复杂的 JSON 结构。我没有使用 Rails,但我对 Ruby 足够陌生,所以我不确定这在这里是否重要。 另一端的 API 期待这样的东西
{ "command" : {
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" },
"param" : { "field" : "val", "otherField":"otherVal" }
}
}
在序列化之前,命令持有什么样的 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" }
]
}
我已经确认第一种格式是预期的,因为手动构建的序列化会通过,而第二种会产生无效的格式错误。
【问题讨论】:
-
如果所有的键字面上都是“参数”,那么这就是 语义无效 JSON - 如果 API 是它想要的,那么它就会被破坏。在 Map(例如 JSON 对象或 Ruby 哈希)中无法复制键。确保所说的无效 JSON 确实是“正确的”。 (并且没有合适的 JSON 库允许发出这种损坏的标记。)
-
嗯。好的。对 API 端没有任何控制权,它接受第一种格式。谢谢。
标签: ruby json serialization