gpt4 book ai didi

ruby - 将表示 JSON 的字符串放入 Ruby 哈希中的有效方法是什么(无需解析和重新编码)?

转载 作者:行者123 更新时间:2023-12-02 01:04:27 27 4
gpt4 key购买 nike

我有一个由 Jbuilder 生成的 JSON 字符串:

json = "{name: 'Peter', email: 'peter@stackoverflow.com'}"

目前这是一个字符串。但是我想在最终将它输出为 JSON 之前将它组合成一个新的散列(最好是在 Ruby 中)。

output = {result: :success, data: json}

但是,如果我将其转换为 JSON,则 json 值会进行双重编码,以便将其作为字符串发送:

output.to_json
#=> "{\"result\":\"success\",\"data\":\"{name: 'Peter', email: 'peter@stackoverflow.com'}\"}"

现在我可以将 JSON 解析为 Ruby 哈希,然后重新输出它,但是当我真正想做的是说“嘿,这个节点已经是 JSON,不要重新编码它!”。

Rails 在 View 中是否有与 raw() 方法等效的方法?即

output = {result: :success, data: raw(json)}

这样这个的 json 评估就变成了:

output.to_json
#=> "{\"result\":\"success\",\"data\": {\"name\":\"Peter\",\"email\":\"peter@stackoverflow.com\"}"

最佳答案

这里有一种方法可以做到这一点,虽然有点 hack,但您可能会发现它很有用。

首先重述问题:

# Note the quotes, your example isn't actually valid
json = "{\"name\": \"Peter\", \"email\": \"peter@stackoverflow.com\"}"

output = {result: :success, data: json}

# Without changing anything
puts JSON.generate(output)

这会产生以下结果,其中 data 的值是单个字符串:

{"result":"success","data":"{\"name\": \"Peter\", \"email\": \"peter@stackoverflow.com\"}"}

json gem 使用 to_json 方法添加到所有对象以将它们转换为 json,因此最简单的修复方法是在您想要不同行为的对象上替换该方法:

# As before
json = "{\"name\": \"Peter\", \"email\": \"peter@stackoverflow.com\"}"

# Replace to_json on the singleton object
def json.to_json *args
self
end

output = {result: :success, data: json}

# Generate the output (output.to_json gives the same result)
puts JSON.generate(output)

这将创建以下内容,其中 data 值现在根据需要本身是一个散列:

{"result":"success","data":{"name": "Peter", "email": "peter@stackoverflow.com"}}

为了避免在代码中操纵单例,一种更简洁的方法是创建一个具有这种行为的字符串子类:

class JsonSafeString < String
def to_json *args
self
end
end

当您希望将内容直接包含在 JSON 对象中时,您现在可以创建一个 JsonSafeString:

json = "{\"name\": \"Peter\", \"email\": \"peter@stackoverflow.com\"}"
output = {result: :success, data: JsonSafeString.new(json)}

puts JSON.generate(output)

结果同上:

{"result":"success","data":{"name": "Peter", "email": "peter@stackoverflow.com"}}

如果需要,您可以将对 JsonSafeString.new 的调用包装在类似 raw_json 的方法中。

显然,这留下了确保您的字符串对您有效的任务——为此使用库的主要目的是用户不必关心诸如是使用单引号还是双引号之类的事情,因此您可以如果您不小心,很容易生成无效的 JSON。此外,这只是一个快速的 hack,可能还有很多我没有考虑的事情。特别是我没有考虑字符编码,所以要小心。

关于ruby - 将表示 JSON 的字符串放入 Ruby 哈希中的有效方法是什么(无需解析和重新编码)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com