To_json вводит странный персонаж

С помощью этого кода я реализовал дерево

groups = {"al1o0"=>"A1", "al2o2"=>"A10", "al2o3"=>"A11", "al1o1"=>"A2"}

map = {}
arr = []

groups.each_with_index do |group, index|
  level = (group.first.split("o")[0].split("al")[1]).to_i - 1
  level = level == 0 ? nil : level
   order = group.first.split("o")[1]
   arr.append({ :id=> index + 1, :order => order, :name => group.last, :parent => level})
end

root = {:id => 0, :name => '', :order => 0, :parent => nil}

arr.each do |e|
  map[e[:id]] = e
end

tree = {}

arr.each do |e|
  pid = e[:parent]
  if pid == nil
    (tree[root] ||= []) << e
  else
    (tree[map[pid]] ||= []) << e
  end
end

дерево имеет

 => {{:id=>0, :name=>"", :order=>0, :parent=>nil}=>[{:id=>1, :order=>"0", :name=>"A1", :parent=>nil}, {:id=>4, :order=>"1", :name=>"A2", :parent=>nil}], {:id=>1, :order=>"0", :name=>"A1", :parent=>nil}=>[{:id=>2, :order=>"2", :name=>"A10", :parent=>1}, {:id=>3, :order=>"3", :name=>"A11", :parent=>1}]} 

Здесь все в порядке, но если я сделаю tree.to_json, результат будет

 => "{\"{:id=\\u003e0, :name=\\u003e\\\"\\\", :order=\\u003e0, :parent=\\u003enil}\":[{\"id\":1,\"order\":\"0\",\"name\":\"A1\",\"parent\":null},{\"id\":4,\"order\":\"1\",\"name\":\"A2\",\"parent\":null}],\"{:id=\\u003e1, :order=\\u003e\\\"0\\\", :name=\\u003e\\\"A1\\\", :parent=\\u003enil}\":[{\"id\":2,\"order\":\"2\",\"name\":\"A10\",\"parent\":1},{\"id\":3,\"order\":\"3\",\"name\":\"A11\",\"parent\":1}]}" 

Почему изменилось: id => 0 in: id => 0?

\u003e - это знак >. Вы получаете это из-за =>
Stefan 07.12.2018 15:05

Чтобы добавить ссылку с комментарием Стефанса: unicode-table.com/en/003E

3limin4t0r 07.12.2018 15:15

Имейте в виду, что в JSON ключ объекта всегда должен быть строкой по этой причине to_s вызывается для предоставленных вами ключей ({:id=>0, :name=>"", :order=>0, :parent=>nil} и другие).

3limin4t0r 07.12.2018 15:19

Покажите ожидаемый результат, я почти уверен, что ваша структура tree неправильная.

Stefan 07.12.2018 15:32

Невозможно воспроизвести в 2.5. Я получаю "{\"{:id=>0, :name=>\\\"\\\", :order=>0, :parent=>nil}\":[{\"id\":1,\"order\":\"0\",\"name\":\"A1\",\‌​"parent\":null},{\"i‌​d\":4,\"order\":\"1\‌​",\"name\":\"A2\",\"‌​parent\":null}],\"{:‌​id=>1, :order=>\\\"0\\\", :name=>\\\"A1\\\", :parent=>nil}\":[{\"id\":2,\"order\":\"2\",\"name\":\"A10\",‌​\"parent\":1},{\"id\‌​":3,\"order\":\"3\",‌​\"name\":\"A11\",\"p‌​arent\":1}]}" @JohanWentholt, пока вы правы. Hash#to_s просто оборачивает весь хеш в виде строки, например. {h:12}.to_s #=> "{:h => 12}". Похоже, есть проблема с кодировкой, которая не раскрывается в вопросе

engineersmnky 07.12.2018 22:19
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
5
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, странно выглядит дерево.

{{:id=>0, :name=>"", :order=>0, :parent=>nil}=>[{:id=>1, :order=>"0", :name=>"A1", :parent=>nil}, ...]}}

вот ключ {: id => 0,: name => "",: order => 0,: parent => nil}

и [{: id => 1,: order => "0",: name => "A1",: parent => nil}, ...] это ценность.

Ключ не должен быть хешем. Как потом называть.

Вам может понадобиться что-то вроде

{"A1" => {name: 'foo', order: '0'}, 'A2' => ...}

Другие вопросы по теме