如何在rails上的ruby中用单引号和双引号解析JSON

时间:2017-07-25 20:02:51

标签: ruby-on-rails json ruby parsing

我遇到一个问题,如果名称带有'"我的JSON解析失败。我想知道如何避免这种情况。

这是我目前的代码:

def create

puts params

#@contact = Contact.new(contact_params)
#@contact.user = current_user

contactsParam = params[:contacts]

if contactsParam

  # contactsParam.each do |contact|
  # end

  contactValues = contactsParam.map { |c| 

    puts "dulce!!! : " + c.to_s

    json = JSON.parse(c)
    result = "('#{json['name']}', '#{json['phone_number']}', '#{json['detail']}', '#{json['image_url']}', '#{json['email']}', '#{json['address']}', '#{json['city']}', '#{json['state']}', '#{json['zipcode']}', '#{json['country']}', #{current_user.id}, now(), now())" 
    result
  }.join(",")

  if contactValues.length > 0
     ActiveRecord::Base.connection.execute("INSERT INTO contacts (name, phone_number, detail, image_url, email, address, city, state, zipcode, country, user_id, created_at, updated_at) VALUES #{contactValues}")
  end
end

这是一个失败的JSON字符串示例(我添加了一堆随机字符进行测试)。

   {"name":"Aaacontacttest'/'@"-jgg&$;$/&/@.'sheh","phone_number":",7*#;878545848487849648","detail":"","image_url":"","email":"test@test.com","address":"-/:;()$@""":$;$:$$/!:!/!,!6677bhgv
2017-07-25T20:08:54.614283+00:00 app[web.1]: Hsbsbsbb7788$!","city":"Hehshdbdb","state":"HSSHHSHS$&:$:$","zipcode":"3319)","country":"United States"}

1 个答案:

答案 0 :(得分:0)

1

让我们首先纠正你给出的JSON对象:

  {
    "name":"Aaacontacttest'/'@"-jgg&$;$/&/@.'sheh",
    "phone_number":",7*#;878545848487849648",
    "detail":"",
    "image_url":"",
    "email":"test@test.com",
    "address":"-/:;()$@""":$;$:$$/!:!/!,!6677bhgv2017-07-25T20:08:54.614283+00:00 app[web.1]: Hsbsbsbb7788$!",
    "city":"Hehshdbdb",
    "state":"HSSHHSHS$&:$:$",
    "zipcode":"3319)",
    "country":"United States"
}

此JSON对象的问题是,它未正确关闭。如果您想在对象中使用引号,请使用反斜杠省略以关闭对象的值。

让我们首先将上面的无效的JSON对象转换为有效的JSON对象,这样的ruby避免语法错误:

 {
    "name":"Aaacontacttest'/'@\"-jgg&$;$/&/@.'sheh",
    "phone_number":",7*#;878545848487849648",
    "detail":"",
    "image_url":"",
    "email":"test@test.com",
    "address":"-/:;()$@\"\"\":$;$:$$/!:!/!,!6677bhgv2017-07-25T20:08:54.614283+00:00 app[web.1]: Hsbsbsbb7788$!",
    "city":"Hehshdbdb",
    "state":"HSSHHSHS$&:$:$",
    "zipcode":"3319)",
    "country":"United States"
}

我们在这做了什么: 以“name”作为键的初始Hash对象具有值:

“名称”:<强> “Aaacontacttest '/' @” -jgg&安培; $; $ /&安培; / @'佘诗曼“

粗体区域,表示您已使用引号将值关闭,其中斜体字符的其余部分被标记为无效。

ruby​​会引发错误的类型“语法错误”或意外的“任何字符”,期望输入结束

我们在值中引入了反斜杠以确保正确关闭该值。

“名称”:<强> “Aaacontacttest '/' @ \” -jgg&安培; $; $ /&安培; / @'佘诗曼“

因此,无论您在值中使用过引号,请使用反斜杠省略它们。

  1. 在ruby的情况下,你提供的对象是普通的哈希对象而不是JSON对象,因为Ruby JSON解析器期望参数是一个字符串,并且不能像哈希或数组那样转换对象

  2. 如果您执行 JSON.generate(hash),您将获得JSON对象:

    注意:哈希如果更正了hashobject。

    在此处添加JSON对象。

    “{\” 名称\ “:\” Aaacontacttest '/' @ \\ “ - 。JGG&安培; $; $ /&安培; / @'佘诗曼\”,\ “PHONE_NUMBER \”:\“,7 *# ; 878545848487849648 \”,\ “细节\”:\ “\”,\ “IMAGE_URL \”:\ “\”,\ “电子邮件\”:\ “test@test.com \”,\ “地址\”:\ “ - /:;()$ @ \\”\\“\\”:$; $:$$ /!:!/!,!6677bhgv2017-07-25T20:08:54.614283 + 00:00 app [web。 1]:Hsbsbsbb7788 $!\“,\”city \“:\”Hehshdbdb \“,\”state \“:\”HSSHHSHS $&amp;:$:$ \“,\”zipcode \“:\”3319) \“,\”country \“:\”美国\“}”

    如果你执行 JSON.parse(HashObject而不是JSONobject),ruby会抛出错误:

    TypeError:没有将Hash隐式转换为String

    要点:

    1. 更正您的hashObject。

    2. 将hashObject转换为ruby的有效JSON对象。如果要生成JSON,请使用JSON.generate(hash)方法。