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

Тема в разделе "Perl, Python, Ruby", создана пользователем Sorcus, 4 дек 2016.

  1. Sorcus

    Sorcus Sorcus. A New Beginning.

    Moderator
    Регистр.:
    10 июл 2011
    Сообщения:
    280
    Симпатии:
    572
    Все-таки не мог не доделать...
    Код:
    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:
     
    Последнее редактирование: 6 дек 2016