Чтобы разобрать эту строку, я бы сделал следующее:
str = "[{ \"spec_id\" => \"1\",
\"item_name\" => \"sku\"}|{ \"spec_id\" => \"2\",
\"item_name\" => \" productname\"}|{ \"spec_id\" => \"4\",
\"item_name\" => \" price\"}]"
mappings = JSON.parse(str.gsub(/}\s*\|\s*{/, '},{').gsub(/\s*\=\>/, ':'))
Это в основном преобразует то, что у вас есть, в строку JSON, удалив '|' символы и преобразование '=>' в ':'. Когда вы, наконец, проанализируете результат, вы будете анализировать JSON, и вы получите хороший Ruby Hash:
[{"spec_id"=>"1", "item_name"=>"sku"}, {"spec_id"=>"2", "item_name"=>" productname"}, {"spec_id"=>"4", "item_name"=>" price"}]