С помощью этого кода я реализовал дерево
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?
Чтобы добавить ссылку с комментарием Стефанса: unicode-table.com/en/003E
Имейте в виду, что в JSON ключ объекта всегда должен быть строкой по этой причине to_s вызывается для предоставленных вами ключей ({:id=>0, :name=>"", :order=>0, :parent=>nil} и другие).
Покажите ожидаемый результат, я почти уверен, что ваша структура tree неправильная.
Невозможно воспроизвести в 2.5. Я получаю "{\"{:id=>0, :name=>\\\"\\\", :order=>0, :parent=>nil}\":[{\"id\":1,\"order\":\"0\",\"name\":\"A1\",\"parent\":null},{\"id\":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\",\"parent\":1}]}" @JohanWentholt, пока вы правы. Hash#to_s просто оборачивает весь хеш в виде строки, например. {h:12}.to_s #=> "{:h => 12}". Похоже, есть проблема с кодировкой, которая не раскрывается в вопросе

Во-первых, странно выглядит дерево.
{{: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' => ...}
\u003e- это знак>. Вы получаете это из-за=>