2013-04-02 3 views
1

Я отправляю объект JSON в ruby ​​с помощью javascript. Но я не могу разобрать его там. Я пробовал следить за вещами, но не повезло. Кроме того, я сейчас искал, но я не мог найти ничего полезного.Ruby - разбор JSON по URL

Обратите внимание, что я очень новый рубин.

Мои испытания:

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 

Я создаю JSON в JavaScript, как это:

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, а затем передал объект рубину. И затем я наконец смог напечатать объект в рубине. Он приведен ниже:

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

Метод .class утверждает, что это массив. Но я не могу получить доступ к данным с классическими способами, например:

array['name'] 

ошибки является:

can't convert String into Integer

И когда я пытаюсь передать его JSON.parse рубина, он дает мне следующую ошибку:

can't convert Array into String

Так что я использовал JSON.parse(conf_array.to_json), но опять же при доступе к данным он дает такую ​​же ошибку, как массивы:

can't convert String into Integer

Что должно быть сделано сейчас?

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 «s конструктор перечисленных выше.

Update3:

Хорошо, теперь я получить хоть что-то из массива. Но когда я доступа к ключу, он отображает сам ключ:

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). 
+0

Вам нужно будет добавить образец 'JSON', который вы пытаетесь проанализировать. – fmendez

+1

Ваши данные для сообщения выглядят подозрительными для меня - смесь параметров, закодированных в форме, и данных json. Когда вы выполняете '' conf = "+ json_of_form_vars', он попытается преобразовать этот объект javascript в строку, что, вероятно, даст что-то бесполезное, как [Object object]. Вам нужно использовать JSON.stringify, чтобы преобразовать его в json. –

+0

@FrederickCheung, вы должны опубликовать это как ответ. Это то, что ОП делает неправильно. –

ответ

0

Я решил это наконец. Используя все предложения, сделанные в рамках этой должности, а также мои IRB опыты с хэшей, массивов, и т.д. JSON

Так вместо того, чтобы преобразовать свой объект (conf_json) в формате JSON (с to_json), я передал его JSON.parse в виде строки как показано ниже:

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

Это кажется немного странно для меня, потому что при попытке передать ему функционировать, как показано ниже, я получил ошибку can't convert Array into String.

parsed_conf = JSON.parse(conf_json) 

Но он работает как шарм прямо сейчас.

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 
           }, 

и т.д ..

+0

Когда я пытаюсь напечатать строку JSON, исходящую из javascript в ruby, он печатает только '[Object object]'. И «.class» также дает тот же результат. Итак, как я могу сбросить эту строку в ruby. Очевидно, что это не простая строка. Также я использовал 'pretty print', но не повезло. – mtndesign

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)} 
+0

Я попробовал ваше предложение и обновил вопрос. – mtndesign

Смежные вопросы