2017-08-02 76 views
0

簡單的解析器,結果比我想象的要困難得多。我需要一個字符串分析器來將嵌套字段轉換爲ruby對象。在我的情況下,API響應只會返回所需的字段。解析JSON像語法到紅寶石對象

鑑於

Parser.parse "album{name, photo{name, picture, tags}}, post{id}" 

所需的輸出或類似

{album: [:name, photo: [:name, :picture, :tags]], post: [:id]} 

有什麼想法?

+0

我不認爲這將是容易的。你從哪裏得到這樣的字符串? – Surya

+0

這是解析器生成器的用例,比如[ANTLR](http://www.antlr.org/) - 如果這是一種自定義語法,您的選擇是手工製作解析器或使用解析器生成器,如ANTLR。 – mcfinnigan

+0

@Surya我想在我的API中實現與Facebook相同的語法選擇字段。由於對象是嵌套的,所以語法也應該允許。 – antulik

回答

0

寫我自己的解決方案

module Parser 
    extend self 

    def parse str 
    parse_list(str).map do |i| 
     extract_item_fields i 
    end 
    end 

    def extract_item_fields item 
    field_name, fields_str = item.scan(/(.+?){(.+)}/).flatten 

    if field_name.nil? 
     item 
    else 
     fields = parse_list fields_str 
     result = fields.map { |field| extract_item_fields(field) } 

     { field_name => result } 
    end 
    end 

    def parse_list list 
    return list if list.nil? 
    list.concat(',').scan(/([^,{}]+({.+?})?),/).map(&:first).map(&:strip) 
    end 
end 

str = 'album{name, photo{name, picture, tags}}, post{id}' 
puts Parser.parse(str).inspect 
# => [{"album"=>["name", {"photo"=>["name", "picture", "tags"]}]}, {"post"=>["id"]}]