Как преобразовать ха sh в JSON без конвертированной строки, полной обратной косой черты - PullRequest
0 голосов
/ 27 января 2020

Я конвертирую га sh в JSON, используя to_json, но преобразованная строка полна обратной косой черты. Если я использую puts, он показывает правильную строку, но если я передаю HTTP::NET request.body, строка полна обратной косой черты.

data = {"a" => "b", "c" => "d", "e" => "f"}
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json', 
          'Authorization' => "xyz")
req.body = data.to_json
res = http.request(req)

req.body отправляет:

"{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"

Мой запрос не выполняется из-за этого.

Мне нужно отправить данные как

"{"a" => "b", "c" => "d", "e" => "f"}"

в теле запроса.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Похоже, вы не понимаете фактическое содержание строки. Обратная косая черта является частью строкового представления и на самом деле отсутствует в строке.

Например, '"' один символ ". Когда вы введете это значение в irb, вы получите:

s = '"'
#=> "\""

Из результата "\"" начальный " и конечный " помечают начало и конец строки, в то время как \" является избежал двойной кавычки и представляет собой одиночный ". Причина, по которой двойные кавычки экранированы, заключается в том, что вы хотите, чтобы Ruby интерпретировал его как символ ", а не как конец строки.

Вы можете просматривать фактическое содержимое строки без escape-символов распечатав его на консоль.

puts s
# "
#=> nil

Здесь вы можете увидеть, что в содержимом строки нет обратного знака sh.


То же самое относится к вашему to_json вызов, который возвращает строку:

data = {"a" => "b", "c" => "d", "e" => "f"}
json = data.to_json
#=> "{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"}"
puts json
# {"a":"b","c":"d","e":"f"}
#=> nil

Как вы видите, в содержимом строки нет обратной косой черты, только в строковом представлении.

2 голосов
/ 27 января 2020

Вы можете решить эту проблему двумя способами: либо вы можете проанализировать JSON там, где вы хотите его использовать, либо вы также можете отправить проанализированный JSON с Ruby кода.

req.body = JSON.parse(data.to_json)

Он вернет результат как:

{"a"=>"b", "c"=>"d", "e"=>"f"}

Это зависит от вас, где вы хотите проанализировать свои данные. Если вы хотите анализировать интерфейс, просто используйте jQuery 'JSON функцию синтаксического анализа.

...