我已经创建了一个传递字符串的基本客户端和服务器,而我已将其更改为JSON。但是JSON字符串只能在通过TCP发送之前进行解析。发送后,字符串版本相同(在chomp之后),但在服务器端,它不再正确处理JSON。这是我的一些代码(修剪了其他位)
部分客户端代码
require 'json'
require 'socket'
foo = {'a' => 1, 'b' => 2, 'c' => 3}
puts foo.to_s + "......."
foo.to_json
puts foo['b'] # => outputs the correct '2' answer
client = TCPSocket.open('localhost', 2000)
client.puts json
client.close;
部分服务器代码
require 'socket'
require 'json'
server = TCPServer.open(2000)
while true
client = server.accept # Accept client
response = client.gets
print response
response = response.chomp
response.to_json
puts response['b'] # => outputs 'b'
end
输出' b'应该是' 2'代替。我该如何解决这个问题?
由于
答案 0 :(得分:3)
在您的服务器中编写了response.to_json
。这会将字符串转换为JSON,然后将其抛弃。而且我也不喜欢.chomp
。
尝试
response = client.gets
hash = JSON.parse(response)
现在hash
是一个Ruby Hash对象,其中包含您的数据,hash['b']
应该可以正常工作。
答案 1 :(得分:1)
问题是.to_json
不解析字符串中的JSON并将其自身替换为结果。它用于将字符串转换为可接受的JSON值格式。
require 'json'
string = "abc"
puts string
puts string.to_json
这将输出:
abc
"abc"
该方法由JSON生成器添加到String
类,并在内部使用它来生成JSON文档。
但为什么response['b']
会返回"b"
?
因为Ruby字符串有一个名为[]
的方法,可用于:
"abc"[0,2] => "ab"
"abc"[1] => "b"
"abc"["bc"] => "bc"
,"abc"["fg"] => nil
"abc"[/^a([a-z])c/, 1] => "b"
所以发生这种情况是因为你的回复是一个字符串,其中包含字符" b"在其中:
response = "something with a b"
puts response["b"]
# outputs b
puts response["x"]
# outputs a blank line because response does not contain "x".
而不是.to_json
您的代码必须致电JSON.parse
或JSON.load
:
data = JSON.parse(response)
puts data['b']