在Ruby中通过TCP发送后,JSON不再可解析

时间:2018-06-06 22:07:13

标签: json ruby tcp

我已经创建了一个传递字符串的基本客户端和服务器,而我已将其更改为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'代替。我该如何解决这个问题?

由于

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.parseJSON.load

data = JSON.parse(response)
puts data['b']