首页 > 解决方案 > Ruby to_json 将西里尔文编码为 un​​icode

问题描述

我有一个像这样的西里尔文字的哈希对象

payload = {'date': "30",'name': 'Тест','phone': "71234567890",'sum': "0",'offer_id': "1"}

我需要将其转换为 json 并像这样发送到 php api 服务

{"date":"30","name":"\u0422\u0435\u0441\u0442","offer_id":"1","phone":"71234567890","sum":"0"}

to_json归还我

{"date":"30","name":"Тест","offer_id":"1","phone":"71234567890","sum":"0"}

在这种情况下,如何将西里尔语编码为 un​​icode?我需要将选项传递给to_json方法吗?

标签: jsonrubystringencoding

解决方案


肯定应该有一个更优雅的解决方案,但String#dump下面会起作用。

  payload.to_json.dump.
    gsub('\\"', '"').
    sub(/\A\s*"\s*|\s*"\s*\z/, '')

查看:

require 'digest/md5'
require 'json'


payload = {'date': "30",'name': 'Тест', 'offer_id': "1", 'phone': "71234567890",'sum': "0",}

expected_json = '{"date":"30","name":"\u0422\u0435\u0441\u0442","offer_id":"1","phone":"71234567890","sum":"0"}'

dumped_json =
  payload.to_json.dump.
    gsub('\\"', '"').
    sub(/\A\s*"\s*|\s*"\s*\z/, '')

puts expected_json
puts 
puts dumped_json
puts 
puts expected_json == dumped_json


puts Digest::MD5.hexdigest(expected_json)
puts Digest::MD5.hexdigest(dumped_json)

请注意,JSON 中的元素顺序无法保证,因此检查 MD5 通常是个坏主意。


推荐阅读