【问题标题】:How to get **nested** objects as JSON from Ruby on the backend to AJAX in the front-end如何将**嵌套**对象作为 JSON 从后端的 Ruby 获取到前端的 AJAX
【发布时间】: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


【解决方案1】:

您的jsonify 方法正在伤害您。

你应该直接调用sample_data.to_json,让JSON模块处理嵌套。


编辑(具有自定义数据类型的 JSON):

要在您的自定义类/对象中支持#to_json,您需要在您的类中添加一个#to_json 方法。即:

require 'json'
class MyClass
   def initialize name, age
     @name = name
     @age = age
   end
   def to_json(*a)
     {name: @name, age: @age}.to_json(*a)
   end
end

[ MyClass.new("John", 24) ].to_json

【讨论】:

  • 哇!我可以发誓这种方法两天都行不通。甚至我的老师也试图让它发挥作用,但无济于事。我只是再次尝试以确保;但这次它奏效了!谢谢!
  • 如果我因为我的原始数据是类实例而收到错误消息,你会不会知道?我要再试一次,希望我仍然没有收到错误:)
  • @Myst 我回到我的原始数据尝试一下,这就是我得到的:{cake: Array(2), cupcake: Array(2), muffin: Array( 2)} cake : Array(2) 0 : "#<0x00007fbc3c994da0><0x00007fbc3c9d7d80><0x00007fbc3c9ad3c8><0x00007fbc3c9ad1c0><0x00007fbc3c992cd0>
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多