Работа с json массивами.

Sorcus

Sorcus. A New Beginning.
Регистрация
10 Июл 2011
Сообщения
513
Реакции
1.002
Все-таки не мог не доделать...
Код:
hash_one = {
        'title' => nil,
        'description' => nil,
        'meta' => {
                'seo_title' => nil,
                'seo_description' => nil
        },
        'comment_list' => [
                {      
                        'comments' => [
                                {      
                                        'author' => nil,
                                        'date' => nil,
                                        'comment' => nil
                                }
                        ],
                        'count' => nil
                }
        ],
        'content' => nil
}

hash_two = {
        'title' => 'Hello World!',
        'meta' => {
                'seo_title' => true
        },
        'comment_list' => [
                {      
                        'comments' => [
                                {      
                                        'author' => 'Admin',
                                        'comment' => 'Default'
                                }
                        ]
                },    
                {      
                        'comments' => [
                                {      
                                        'date' => '123'
                                }
                        ]
                },
                {
                        'comments' => nil
                }
        ]
}

class Hash
        def deep_merge(hash)
                hash.merge(self) do |key, value_one, value_two|
                        if value_two.is_a?(Hash)
                                value_one.merge!(value_two)
                        elsif value_two.is_a?(Array)
                                array = Array.new
                                value_two.each do |value|
                                        array << value.deep_merge(value_one[0].dup)
                                end
                                array
                        elsif value_two.is_a?(NilClass)
                                value_one unless value_one.is_a?(NilClass)
                        else
                                value_two
                        end
                end
        end
end


p hash_two.deep_merge(hash_one)
Собственно код работает, мержит не только чистые хеши, но и хеши, вложенные в массивы.
А так же заменяет nil значения на шаблонный хэш/массив, если он там должен быть ( см. 3-й comments в hash_two ).
Вариант возможно не окончательный, т.к. я не знаю, способен ли скрипт обработать любые хеши.
Ну и если есть советы по улучшению кода - отписывайтесь. Ибо мой вариант скорее похож на костыль.
Если кому-то пригодится - отписывайтесь о результатах и багах. Спасибо всем за помощь. Особенно @Nei .:glob:
 
Последнее редактирование:
Сверху