Json 如何更改Ruby的哈希返回格式

Json 如何更改Ruby的哈希返回格式,json,ruby,ruby-hash,Json,Ruby,Ruby Hash,我有以下散列: {"description":"Hello","id":"H"}` 如果我在控制台中键入哈希,我会得到: {:description=>"Hello", :id=>"H"} 我希望它使用“description”和“id”返回前面提到的相同表单 有没有办法更改我的哈希返回的格式?您有一个带有密钥的: hash = {:description=>"HS - Hours", :id=>"HS"} hash.stringify_keys => {"d

我有以下散列:

{"description":"Hello","id":"H"}`
如果我在控制台中键入哈希,我会得到:

{:description=>"Hello", :id=>"H"}
我希望它使用
“description”
“id”
返回前面提到的相同表单

有没有办法更改我的哈希返回的格式?

您有一个带有密钥的:

hash = {:description=>"HS - Hours", :id=>"HS"}

hash.stringify_keys
=> {"description"=>"HS - Hours", "id"=>"HS"}
考虑一下这一点:

({"description": "Hello", "id": "H"}) == ({"description"=> "Hello", "id"=> "H"})
#=> false

({"description": "Hello", "id": "H"}) == ({description: "Hello", id: "H"})
#=> true
Ruby仅在打印时删除

p ({"description":"Hello","id":"H"})
#=> {:description=>"Hello", :id=>"H"}

如果您想将密钥转换为,可以使用纯Ruby(或bang版本的
转换密钥!
):


如果您正在寻找json,请执行以下操作:

require 'json'

puts h.to_json
#=> {"description":"Hello","id":"H"}

还考虑到:

h.to_json.class #=> String
h.class #=> Hash

您有一个带钥匙的:

考虑一下这一点:

({"description": "Hello", "id": "H"}) == ({"description"=> "Hello", "id"=> "H"})
#=> false

({"description": "Hello", "id": "H"}) == ({description: "Hello", id: "H"})
#=> true
Ruby仅在打印时删除

p ({"description":"Hello","id":"H"})
#=> {:description=>"Hello", :id=>"H"}

如果您想将密钥转换为,可以使用纯Ruby(或bang版本的
转换密钥!
):


如果您正在寻找json,请执行以下操作:

require 'json'

puts h.to_json
#=> {"description":"Hello","id":"H"}

还考虑到:

h.to_json.class #=> String
h.class #=> Hash


用于提供对象可读表示的方法是
#inspect
。这也是大多数REPL用来显示对象的方法,尽管有些REPL使用其他特定于REPL的方法,如
#pretty_inspect

非常重要的是,所有这些方法仅供人类使用。您不能解析它们的输出,不能将它们用于序列化、处理或任何其他目的,而只能将其用于调试目的

因此,知道所讨论的方法是
Hash#inspect
,您可以尝试重写该方法。请注意,更改核心方法的行为永远不应该在生产代码中进行。以下仅为该答案的示例:

模块HashPrettyPrintExtension
def检查
“{'”你好“,:id=>“H”}
使用hashprettyprintfinition
{“description”:“Hello”,“id”:“H”}
#=>{“描述”:“你好”,“id”:“H”}
请注意,您建议的输出有一定的限制。它只适用于
Symbol
s的键和
String
s的值,而在Ruby中,键可以是任意对象,值可以是任意对象


此外,您建议的输出与
#inspect
的目标正好相反,即提供人类可读的调试输出,因为键不是字符串不容易看到。

用于提供对象的人类可读表示的方法是
#inspect
。这也是大多数REPL用来显示对象的方法,尽管有些REPL使用其他特定于REPL的方法,如
#pretty_inspect

非常重要的是,所有这些方法仅供人类使用。您不能解析它们的输出,不能将它们用于序列化、处理或任何其他目的,而只能将其用于调试目的

因此,知道所讨论的方法是
Hash#inspect
,您可以尝试重写该方法。请注意,更改核心方法的行为永远不应该在生产代码中进行。以下仅为该答案的示例:

模块HashPrettyPrintExtension
def检查
“{'”你好“,:id=>“H”}
使用hashprettyprintfinition
{“description”:“Hello”,“id”:“H”}
#=>{“描述”:“你好”,“id”:“H”}
请注意,您建议的输出有一定的限制。它只适用于
Symbol
s的键和
String
s的值,而在Ruby中,键可以是任意对象,值可以是任意对象


此外,您建议的输出与
#inspect
的目标正好相反,即提供人类可读的调试输出,因为键不是字符串不容易看到。

这几乎是我想要的,但我需要键和它们各自的值之间的分隔为分号,不是箭头=>您试图实现的结果看起来更像json。不能用分号分隔散列。试试hash.to_JSON,它看起来像JSON。这可能是一个XY问题:“你能解释一下你到底想做什么以及为什么要这么做吗?这几乎就是我想要的,但我需要键和它们各自的值之间的分隔是分号,而不是箭头=>你试图实现的结果看起来更像一个json。不能用分号分隔散列。试试hash.to_JSON,它看起来像JSON。这可能是一个XY问题:“你能解释一下你到底想做什么以及为什么要这么做吗?从技术上讲,如果你覆盖了用于转储的哈希方法,那么是的,但不鼓励这样做,特别是当其他人正在使用你的代码并且期望默认输出时。与其试图改变它,不如理解这两种形式是同义的。你是想得到散列的JSON表示吗?如果是,请尝试
hash.to_json
。(您可能必须
要求使用“json”
)从技术上讲,如果您覆盖用于转储的哈希方法,则是可以的,但不鼓励这样做,尤其是当其他人正在使用您的代码并期望默认输出时。与其试图改变它,不如理解这两种形式是同义的。你是想得到散列的JSON表示吗?如果是,请尝试
hash.to_json
。(您可能必须
要求使用“json”