【问题标题】:how to parse JSON with single and double quotes in ruby on rails如何在 ruby​​ on rails 中用单引号和双引号解析 JSON
【发布时间】:2017-07-25 20:02:51
【问题描述】:

我遇到一个问题,如果名称带有 '",我的 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"}

【问题讨论】:

  • 从代码中删除所有不相关的绒毛并显示实际输入。
  • 您真的需要为result 插入这些值吗?
  • @RickS:这显然不是一个有效的 json。你想在这里做什么?
  • @RickS:ruby 有多种字符串替换方法。 gsub 就是其中之一,看看吧。
  • @RickS 您输入的问题是您想转义“内部”引号,而不是“外部”引号。至少可以说,您如何确定哪个是重要的。

标签: ruby-on-rails json ruby parsing


【解决方案1】:

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

我们在这里做了什么: 以“名称”为键的初始 Hash 对象有一个值:

"name":"Aaacontacttest'/'@"-jgg&$;$/&/@.'sheh"

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

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

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

"name":"Aaacontacttest'/'@\"-jgg&$;$/&/@.'sheh"

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

    1234563 .

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

注意:如果是正确的散列对象,则散列。

在此处添加 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 应用程序[web.1] : Hsbsbsbb7788$!\",\"city\":\"Hehshdbdb\",\"state\":\"HSSHHSHS$&:$:$\",\"zipcode\":\"3319)\", \"国家\":\"美国\"}"

如果你这样做 JSON.parse(HashObject not JSONobject) ruby​​ 会抛出一个错误:

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

总结:

  1. 更正您的 hashObject。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 2013-12-14
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多