我遇到一个问题,如果名称带有'
或"
我的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"}
答案 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&安培; $; $ /&安培; / @'佘诗曼“
因此,无论您在值中使用过引号,请使用反斜杠省略它们。
在ruby的情况下,你提供的对象是普通的哈希对象而不是JSON对象,因为Ruby JSON解析器期望参数是一个字符串,并且不能像哈希或数组那样转换对象强>
如果您执行 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
要点:
更正您的hashObject。
将hashObject转换为ruby的有效JSON对象。如果要生成JSON,请使用JSON.generate(hash)方法。