问题
尝试将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>'
在我的电脑上运行 - 规格
我需要运行的虚拟机失败 - 规格
更新下午3点 所以我决定循环遍历每个字符,每个字符都通过if条件正则表达式([A-Za-z0-9:-_ \ n {} \&#34; \&#39;])。基本上我包括我在json中使用的所有字符。一个字符被排除在控制台中打印为什么,字符的序数是65279,它在我的字符串的开头。当我解析除第一个字符之外的json时,它工作得很好。因此,我使用它的优雅解决方案是将文件读取行更改为
File.read('DirectRoutingTable.json')[1..-1]
所以2个问题
用于确定问题的代码 要求&#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
*
答案 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文件中删除。