【问题标题】:Ruby - parsing JSON coming via URLRuby - 解析来自 URL 的 JSON
【发布时间】:2013-03-23 15:04:32
【问题描述】:

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

请注意,我是非常新的 ruby​​。

我的试验:

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']

错误是:

无法将字符串转换为整数

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

无法将数组转换为字符串

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

无法将字符串转换为整数

现在应该做什么?

更新2 这是我的 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).

【问题讨论】:

  • 您必须包含您尝试解析的JSON 的样本。
  • 您的帖子数据对我来说看起来很可疑 - 表单编码参数和 json 数据的混合。当您执行"conf=" + json_of_form_vars 时,它会尝试将该javascript 对象转换为字符串,这可能会产生一些无用的东西,例如[Object object]。您需要使用 JSON.stringify 将其转换为 json。
  • @FrederickCheung,您应该将其发布为答案。这就是 OP 做错了。
  • @AlexD 是的,我很懒!
  • 我尝试了您的建议并更新了我的问题。

标签: javascript ruby json url


【解决方案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
                                },

等等。

【讨论】:

  • 当我尝试在 ruby​​ 中打印来自 javascript 的 JSON 字符串时,它只打印 [Object object]。而.class,也给出了相同的输出。那么如何将这个字符串转储到 ruby​​ 中。显然,它不是一个普通的字符串。我也使用了pretty print,但也没有运气。
【解决方案2】:

目前您实际上并没有发布 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)}

【讨论】:

    【解决方案3】:

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

    因此,我没有将我的对象 (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)
    

    但它现在就像一个魅力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多