如何在 Ruby 中解析带有单引号(')的 JSON 字符串?

3

我正在尝试解析一个类似于以下格式的 JSON 字符串:

JSON.parse("{'foo' : 42 }")

然而,这导致了一个JSON::ParseError错误:
JSON::ParserError: 757: unexpected token at '{'foo' : 42 }'
    from /Users/nils/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/json/common.rb:155:in `parse'
    from /Users/nils/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/json/common.rb:155:in `parse'
    from (irb):2
    from /Users/nils/.rvm/rubies/ruby-2.1.2/bin/irb:11:in `<main>'

我认为JSON解析器期望'字符是"字符。我有数千兆字节的这类文件,所以我想让解析器能够正常工作。由于某些值也可能包含'字符,因此我不能简单地对它们进行搜索和替换,因为那样可能会破坏原始内容。
你有什么建议可以使JSON解析器解析这个问题吗?

2
问题最好在发生的地方解决。如果你试图之后再解决它,你会陷入更多麻烦。在这种情况下,出现问题的是你得到了无效的JSON字符串。你应该尝试修复导致你得到错误字符串的任何问题,而不是试图强制解析器读取无效的JSON。 - sawa
1
我认为这不是一个有效的 JSON。在这里也可以检查 http://jsonlint.com/。 - xlembouras
1
顺便提一下,一个勾号是 。一个 '` 被称为单引号。 - sawa
1
你可以使用JavaScript编写一个简单的转换器。只需使用eval加载文件(因为它们是有效的JavaScript,即使不是有效的JSON),然后使用JSON.stringify重新序列化它们。 - James M
1
为了编程的缘故,你可以尝试用双引号替换所有单引号:JSON.parse "{'foo' : 42 }".gsub(/'/, """) - Felix
显示剩余2条评论
1个回答

6

I am trying to parse a JSON String like this:

JSON.parse("{'foo' : 42 }")

这不是一个JSON字符串。

然而,这会导致一个JSON::ParseError

这是正确的,因为这个字符串不是JSON。

有什么建议可以让JSON解析器解析它吗?

你不能用JSON解析器解析这个字符串,因为它不是JSON。

你需要找出它属于哪种语言,然后使用该语言的解析器。

你发帖的片段看起来像YAML,但当然这可能只是偶然的。

require 'yaml'

YAML.load("{'foo' : 42 }")
# => { "foo" => 42 }

但请注意,从一个单一的、简短的例子中尝试猜测语言是非常容易出错的。您应该与序列化的生产者商讨并询问他们使用的是哪种语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接