2

我正在使用 javascript 向 ruby​​ 发送一个 JSON 对象。但我无法在那里解析它。我尝试了以下东西,但没有运气。我也一直在寻找一段时间,但我找不到任何有用的东西。

请注意,我是非常新的红宝石。

我的试验:

def initialize(game_conf_json)        
    parsed_conf = JSON.parse(conf_json)
    @param1 = parsed_conf['name'][0]
    @param2 = parsed_conf['surname'][0]

    =begin
    I also tried this:
    @param1 = parsed_conf['name']
    @param2 = parsed_conf['surname']

    But no matter what other things I try, I'm getting the following error:
    "21:in `[]': can't convert String into Integer (TypeError)"

    OR

    "can't convert Array into String (TypeError), "

    =end


    File.open("some_direc/conf.json", "w") do |f|
        f.write(game_conf_json)
    end

end

我像这样在javascript中创建json:

var json_of_form_vars = {};
json_of_form_vars.name = name_val;
json_of_form_vars.surname = surname_val;

并以这种方式发送:

$.ajax({
    url: "../fundament/dispatch.rb/",
    type: "post",
    dataType: "json",
    data: "conf="+json_of_form_vars,
    .....

我怎么解决这个问题?是否有针对此问题的适当教程?

UPDATE1(根据建议): 我使用 JSON.stringify 然后将对象传递给 ruby​​。然后我终于可以用 ruby​​ 打印对象了。它在下面列出:

{"name": "METIN", "surname": "EMENULLAHI"}

方法 .class 声称它是一个数组。但我无法使用经典方式访问数据,例如:

array['name']

错误是:

无法将字符串转换为整数

当我尝试将它传递给JSON.parsein ruby​​ 时,它给了我以下错误:

无法将数组转换为字符串

所以我使用JSON.parse(conf_array.to_json)了,但是在访问数据时再次出现与数组相同的错误:

无法将字符串转换为整数

现在应该怎么办?

UPDATE2 这是我的 cgi 处理程序,它将 URL 参数传递到适当的位置:

cgi_req = CGI::new
puts cgi_req.header

params_from_request = cgi_req.params

logger.error "#{params_from_request}"

action_todo = params_from_request['action'][0].chomp

base = Base.new

if action_todo.eql?('create')
    conf_json = params_from_request['conf']
    # This line prints the json like this: {"name": "SOME_NAME", "surname": "SOME_SURNAME"}
    logger.error "#{conf_json}"
    base.create_ident(conf_json) 
end

在基类中:

def create_ident(conf_json)
   require 'src/IdentityCreation'
   iden_create = IdentityCreation.new(conf_json)
end

IdentityCreation的构造函数在上面列出。

更新3:

好的,我现在至少从数组中得到了一些东西。但是当我访问一个密钥时,它会显示密钥本身:

parsed_conf = JSON.parse(conf_json.to_json)
@param1 = parsed_conf[0]['name']
@param2 = parsed_conf[0]['surname']

# At this point when I print the @param1, it gives me "name"(the key), not "SOME_NAME"(the value).
4

3 回答 3

1

这里是解析 JSON 字符串的示例。如果仍有问题,请发布生成的 JSON 以便我们试用。

require 'json'
require 'ap'

string = %{
  {"configurations" : [ 
  { "drinks" : [
          {"menus" : [
            { "hot" : [
              {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
              {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
            ] },

            { "cold" : [
          {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
              {"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
             ] },

            { "terminals" : { "id" : 4, "id": 6, "id": 7 } }, 

            { "keys" : { "debit" : "on", "credit": "off" }  }

          ] }
  ] } ] } 
}

hash = JSON.parse(string)
ap hash

{
    "configurations" => [
        [0] {
            "drinks" => [
                [0] {
                    "menus" => [
                        [0] {
                            "hot" => [
                                [0] {
                                          "id" => 15,
                                        "unit" => "0.33",
                                       "price" => "1",
                                    "currency" => "Euro",
                                    "position" => 4
                                },

ETC..

于 2013-04-02T10:58:33.877 回答
1

目前,您实际上并没有发布 json。您正在尝试发布包装在表单编码参数中的 json。此外,当你这样做

"conf=" + json_of_form_vars

javascript 将为json_of_form_vars您转换为字符串,但该转换与转储为 JSON 不同。Javascript 默认字符串转换对于对象来说是非常无用的,因此您需要使用 JSON.stringify 来获取实际的 json。

由于您将正文编写为字符串文字,因此您还需要转义在此上下文中不允许(或具有特殊含义)的任何特殊字符。让 jquery 完成繁重的工作通常更容易,比如

$.ajax({
    url: "../fundament/dispatch.rb/",
    type: "post",
    dataType: "json",
    data: {conf: JSON.stringify(json_of_form_vars)}
于 2013-04-02T13:00:47.980 回答
0

我终于解决了。使用在这篇文章下提出的所有建议,以及我在哈希、数组、json 等方面的 irb 经验。

因此,我没有将对象 ( conf_json) 转换为 json (with ),而是将其作为字符串to_json传递给,如下所示:JSON.parse

parsed_conf = JSON.parse(%{#{conf_json}})

这对我来说似乎有点奇怪,因为当尝试将它传递给下面的函数时,我得到了can't convert Array into String.

parsed_conf = JSON.parse(conf_json)

但它现在就像一个魅力。

于 2013-04-03T11:36:35.037 回答