【问题标题】:Checking if a string is valid json before trying to parse it?在尝试解析之前检查字符串是否是有效的 json?
【发布时间】:2014-12-01 16:44:04
【问题描述】:

在 Ruby 中,有没有办法在尝试解析字符串之前检查它是否是有效的 json?

例如从其他一些 url 获取一些信息,有时它返回 json,有时它可能返回一个无效响应的垃圾。

我的代码:

def get_parsed_response(response)
  parsed_response = JSON.parse(response)
end

【问题讨论】:

  • 我很确定解析它是确定它是否有效的唯一方法。为什么不解析它并处理告诉你它无效的解析错误?
  • 例如这样JSON.parse(string) rescue nil
  • 理论上应该是有办法的。解析字符串会产生比知道它是否可解析的适当更强的信息。在乔姆斯基的术语中,关于自然语言,这种区别对应于强与弱的生成能力。但是,像上面的 cmets 那样挽救错误有什么问题呢?
  • 或者你可以使用Regex to validate JSON
  • 从技术上讲,判断一个字符串在一种语言中是否有效的过程就是解析。构建一个告诉你如何它是有效的数据结构实际上只是一个副作用。

标签: ruby json


【解决方案1】:

我认为 parse_json 应该返回 nil 如果它无效并且不应该出错。

def parse_json string
  JSON.parse(string) rescue nil
end

unless json = parse_json string
  parse_a_different_way
end

【讨论】:

  • 因为它更漂亮...事实上,我正在考虑开放 JSON 并创建一个名为 parse_without_error 的方法。
  • 请注意,nullfalse 也是有效的 JSON。 JSON.parse 返回 nilfalse 在上面的代码中将被视为解析错误。
【解决方案2】:

您可以创建一个方法来进行检查:

def valid_json?(json)
    JSON.parse(json)
    return true
  rescue JSON::ParserError => e
    return false
end

【讨论】:

  • 救援异常是危险的。只有在绝对必要时才应使用它。而是救援几个异常,例如:救援 TypeError、JSON::ParserError 等。
  • 不需要使用“开始”。 def - 救援 - 结束应该工作
  • 谢谢 Taufiq Muhammadi。让我的答案更好。
  • 你也不需要“返回”。
【解决方案3】:

你可以这样解析

begin
  JSON.parse(string)  
rescue JSON::ParserError => e  
  # do smth
end 

# or for method get_parsed_response

def get_parsed_response(response)
  parsed_response = JSON.parse(response)
rescue JSON::ParserError => e  
  # do smth
end

【讨论】:

  • 请注意,如果在 下存在无法隐式转换为字符串的内容(例如 nil),则可能存在“TypeError”
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多