【发布时间】:2018-10-02 10:01:49
【问题描述】:
注意:本文的问题和答案在此过程中进行了编辑。如果 cmets 没有意义,那是因为原始问题和答案不同。不过,我认为它仍然有很多很好的信息。
更新:我是 Ruby 的新手。在尝试了这篇文章中推荐的一些解决方案后,我发现 .to_json 方法确实适用于嵌套哈希和数组。问题是它不对嵌套的哈希和数组起作用,如果它们是类的实例的话。我有嵌套类实例的数据,当我在客户端解析 JSON 时,它给了我这个:
["#<Cake:0x00007fc37b19f988>", "#<Cake:0x00007fc37b19f5c8>"]
0 : "# <Cake:0x00007fc37b19f988>"
1 : "#<Cake:0x00007fc37b19f5c8>"
(只是带有对象 id 的字符串)
如果有人可以帮助我指出正确的方向吗?谢谢!
原问题:
我在后端使用 sinatra/Ruby,在前端使用 ajax 调用。
一旦 JSON 对象到达前端,我就无法解析它。我看到 JSON 只解析了一层。换句话说,如果我有一个对象数组,我可以得到这些对象,但我不能得到任何嵌套对象;因此,我编写了一个递归函数来尝试正确格式化嵌套对象,但它们仍然无法解析。
谁能帮我弄清楚如何将 JSON 从 Ruby 发送到 AJAX 请求。
这是我的 Ruby 代码:
require 'json'
sample_data = [
{ :category => 'muffin',
:flavor => 'chocolate',
:ingredients => {
:dairy => ["milk", "butter"],
:grain => ["wheat"]
}
},
{ :category => 'muffin',
:flavor => 'blueberry',
:ingredients => {
:dairy => ["milk", "butter"],
:grain => ["wheat"]
}
}]
#recursive function that applies .to_json to every nested array or object:
def jsonify(data)
if data.class == Hash
container = {}
data.each do |key, value|
if value.class != Hash && value.class != Array
container[key.to_sym] = value
else
container[key.to_sym] = jsonify(value)
end
end
elsif data.class == Array
container = []
index = 0
while index < data.length
value = data[index]
if value.class != Hash && value.class != Array
container[index] = value
else
container[index] = jsonify(value)
end
index += 1
end
end
container.to_json
end
这是我的路线发送的内容:
jsonify(sample_data)
将我的 Ajax 请求格式化为一个承诺(但认为这不相关?)
requestPromise("http://localhost:4567/jsondata","GET")
.then(data => {
let parsedData = JSON.parse(data);
console.log(parsedData)
})
.catch(err => {
console.log(err)
})
但是,在客户端,我得到了这个:
(2) ["{"category":"muffin","flavor":"chocolate","ingredi...\"butter\\"]\",\"grain\":\"[\\"小麦\\"]\"}"}", "{"类别":"松饼","风味":"巧克力","ingredi...\"黄油\\"]\",\"谷物\":\ "[\\"小麦\\"]\"}"}"]
我所有的嵌套对象仍然是字符串,并且有一堆转义字符。
谁能帮我弄清楚我做错了什么,以及如何正确地做。谢谢!
【问题讨论】:
-
parsedData的值是多少? -
为什么不打电话给
sample_data.to_json?通过尝试更改内部对象,您正在抛弃 JSON 模块。 -
@fongfan999 JSON 字符串正在被“数据”变量捕获。 parsedData 是我将该字符串传递给 JSON.parse() 方法的结果的名称。
标签: javascript json ruby ajax recursion