Ruby无法解析Json

时间:2017-01-02 18:55:38

标签: json ruby

问题

尝试将json文件转换为哈希值。我得到解析错误。这让我疯了好几天。更令人困惑的是,我的代码在一台计算机上运行,​​但同样的代码在另一台计算机上不起作用。

我已经使用了JSON文件本身的各种内容。甚至简单的一行json也失败了。奇怪的是,如果我将相同的JSON内容复制/粘贴到文字字符串中而不是从文件中解析,它就可以正常工作。

我的代码

require 'json'
read_json = File.read('DirectRoutingTable.json')
hashed_json = JSON.parse(read_json)
puts hashed_json

JSON文件的内容

{" name":" manni"}

错误消息

/usr/lib/ruby/vendor_ruby/json/common.rb:155:in \`parse': 757: unexpected token at '{ "name": "manni"} (JSON::ParserError)

'

from /usr/lib/ruby/vendor_ruby/json/common.rb:155:in \`parse'

from 5example.rb:3:in \`<main>'

在我的电脑上运行 - 规格

  • ruby​​ 1.9.3p551(2014-11-13)[i386-mingw32]
  • json(1.8.3)

我需要运行的虚拟机失败 - 规格

  • ruby​​ 1.9.3p484(2013-11-22修订版43786)[x86_64-linux]
  • json(1.8.3)

更新下午3点 所以我决定循环遍历每个字符,每个字符都通过if条件正则表达式([A-Za-z0-9:-_ \ n {} \&#34; \&#39;])。基本上我包括我在json中使用的所有字符。一个字符被排除在控制台中打印为什么,字符的序数是65279,它在我的字符串的开头。当我解析除第一个字符之外的json时,它工作得很好。因此,我使用它的优雅解决方案是将文件读取行更改为

File.read('DirectRoutingTable.json')[1..-1]

所以2个问题

  • 这到底是什么字符65279?
  • 为什么File.read()包含此字符?

用于确定问题的代码     要求&#39; json&#39;     read_json = File.read(&#39; foo.json&#39;)

new_string = ''

puts '********************************************'
counter = 0

read_json.split("").each do |ch|
  print 'Character Number: ' + counter.to_s + "\n"
  print "Character: '" +  ch + "'\n"
  print "Character value: '" +  ch.ord.to_s + "'\n"
  if ch =~ /[A-Za-z0-9:\-\_ \n\{\}\"\']/
    puts 'Matches new string: Yes'
  else
    puts 'Matches new string: No'
  end
  puts '*'
  counter = counter + 1
end

输出

Character Number: 0
Character: ''
Character value: '65279'
Matches regex: No
*
Character Number: 1
Character: '{'
Character value: '123'
Matches regex: Yes
*
Character Number: 2
Character: ' '
Character value: '32'
Matches regex: Yes
*
Character Number: 3
Character: '"'
Character value: '34'
Matches regex: Yes
*
Character Number: 4
Character: 'n'
Character value: '110'
Matches regex: Yes
*
Character Number: 5
Character: 'a'
Character value: '97'
Matches regex: Yes
*
Character Number: 6
Character: 'm'
Character value: '109'
Matches regex: Yes
*
Character Number: 7
Character: 'e'
Character value: '101'
Matches regex: Yes
*
Character Number: 8
Character: '"'
Character value: '34'
Matches regex: Yes
*
Character Number: 9
Character: ':'
Character value: '58'
Matches regex: Yes
*
Character Number: 10
Character: ' '
Character value: '32'
Matches regex: Yes
*
Character Number: 11
Character: '"'
Character value: '34'
Matches regex: Yes
*
Character Number: 12
Character: 'm'
Character value: '109'
Matches regex: Yes
*
Character Number: 13
Character: 'a'
Character value: '97'
Matches regex: Yes
*
Character Number: 14
Character: 'n'
Character value: '110'
Matches regex: Yes
*
Character Number: 15
Character: 'n'
Character value: '110'
Matches regex: Yes
*
Character Number: 16
Character: 'i'
Character value: '105'
Matches regex: Yes
*
Character Number: 17
Character: '"'
Character value: '34'
Matches regex: Yes
*
Character Number: 18
Character: '}'
Character value: '125'
Matches regex: Yes
*
Character Number: 19
Character: '
'
Character value: '10'
Matches regex: Yes
*

2 个答案:

答案 0 :(得分:5)

谢谢@HomePlaneR

现在知道导致所有问题的神秘角色是BOM,真正优雅的解决方案是正确读取文件。以下代码有效。

require 'json'
json_file = File.open('DirectRoutingTable.json', 'r:bom|utf-8')
read_json = json_file.read
hashed_json = JSON.parse(read_json)
puts hashed_json

答案 1 :(得分:3)

“65279”字符是字节顺序标记。

https://en.wikipedia.org/wiki/Byte_order_mark

某些解析器在输入流中存在时可能会出现问题。您可以使用Notepad ++等文本编辑器将其从JSON文件中删除。