Ruby序列化数据结构

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

我试图从Ruby序列化一个复杂的JSON结构。我没有使用Rails,但我对Ruby很新,所以我不确定这在这里是否重要。 另一端的API预期会出现类似的情况

{ "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,
      ] 
    }