Сортировка изменений в JSON.parse - Ruby - PullRequest
1 голос
/ 01 апреля 2011

В приведенном ниже коде порядок моих элементов изменяется после строки JSON.parse (f), т.е. этот хэш:

{ a => aval, b => bval, c => cval, d => dval }

становится чем-то вроде:

{ b => bval, c => cval, a => aval, d => dval }

Это проблема, потому что мой код дисплея просто читает из файла json, поэтому каждый раз, когда я сохраняю его и затем отображаю, все вокруг меняется. Что я могу сделать, чтобы сохранить заказ?

КОД:

  f = File.read($PLAN_DESC_PATH)
  puts ("f " + f.to_s())
  hash = JSON.parse(f)
  puts ("hash " +  hash.to_s())

Моя версия Ruby - 1.8.7. Я использую Синатру. Я думаю, что я получил драгоценный камень JSON отсюда: http://flori.github.com/json/ (извините, вроде как новичок в этом). Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Джек ответил за Руби, поэтому я отвечу за JSON.От RFC 4627 (выделение добавлено):

"Объект представляет собой неупорядоченный набор из нуля или более пар имя / значение"

2 голосов
/ 02 апреля 2011

В Ruby 1.8.7 класс Hash не поддерживает порядок ни по ключам, ни по добавленному порядку.Если вам нужно что-то подобное, вам нужно реализовать что-то вроде ActiveSupport :: OrderedHash (http://rubydoc.info/docs/rails/ActiveSupport/OrderedHash)

В Ruby 1.9.x хеши упорядочены по их вставке по умолчанию (см. http://www.ruby -doc.org / core / classes / Hash.html )

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

2 голосов
/ 01 апреля 2011

Нет, хеш-карты не предназначены для конкретного заказа.Если вам нужно упорядочить, используйте что-то другое, например array .Или извлеките все ключи, отсортируйте их так, как вы хотите, и тогда вы можете иметь тот порядок, который вам нравится.

В любом случае делать предположения относительно порядка размещения внутри карт - это то, на что вам не следует полагаться, это факт.

Хорошей альтернативой будет иметь:

[ [a, aval], [b, bval], ... ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...