У меня есть хеш, который выглядит примерно так:
{ :a => "some string", :b => "another string", :c => "yet another string" }
Я не хочу в конечном итоге вызвать to_json
, но результирующая строка json не может быть длиннее n
байтов.
Если строка слишком большая, то сначала нужно урезать сначала :c
.Если этого недостаточно, :b
следует усечь.Наконец :a
.Также строки могут содержать многобайтовые символы, такие как немецкие умляуты, а версия для Ruby - 1.8.7.(Умлауты сначала занимают 2 байта, но как json они имеют длину 5 байтов.)
То, что я написал, было циклом, который преобразует хеш в _json и проверяет длину.Если оно меньше или равно n
, оно возвращается, в противном случае я объединяю значения :a
+ :b
+ :c
и сокращаю вдвое.Если новый хеш слишком большой (маленький), я сокращаю (расширяю) на 1/4, 1/8, 1/16 от исходной строки.Наконец я получаю длину hash.as_json == n
.
Все это кажется очень хакерским, и хотя все тесты проверяют, я не уверен, что это даже стабильно.
У кого-нибудь есть хорошее предложение, как решитьэто правильно?