2012-09-10 91 views
0

這是我的字符串如何將字符串轉換爲哈希

"{web:{url:http://www.example.com,toke:somevalue},username:person}"

我想將它轉換成一個哈希值,像這樣:

```

{ 
    'web' => { 
    'url' => "http://www.example.com", 
    'token' => 'somevalue' 
    }, 
    'username' => "person" 
} 

` `

+0

你可以告訴我們有關哈希的字符串表示形式的細節,因爲它既不是散列字符串表示的Ruby或JSON味道? – waldrumpus

+0

如何判斷'url'是一個鍵還是'url:http'是一個鍵?而且,將'toke'轉換爲'token'的規則是什麼? – sawa

+0

如何使用您的格式設置空值? – rogal111

回答

1

你必須編寫一個自定義分析器。它幾乎是json,但由於這些值未被引用,因此不會使用JSON解析器進行解析,因此除非您可以獲取引用的值,否則必須手動解析它。

在值中處理冒號,逗號和大括號將是一個挑戰。

+0

謝謝,你能幫忙嗎? – chucai

+0

當然,使用JSON。 –

1

簡單的解析器,僅在幾個示例上進行了測試。

用法:

parse_string("{web:{url:http://www.example.com,toke:somevalue},username:person}") 
=> {"web"=>{"url"=>"http://www.example.com", "toke"=>"somevalue"}, "username"=>"person"} 

解析器代碼:

class ParserIterator 
    attr_accessor :i, :string 
    def initialize string,i=0 
    @i=i 
    @string=string 
    end 

    def read_until(*sym) 
    res='' 
    until sym.include?(s=self.curr) 
     throw 'syntax error' if s.nil? 
     res+=self.next 
    end 
    res 
    end 

    def next 
    self.i+=1 
    self.string[self.i-1] 
    end 

    def get_next 
    self.string[self.i+1] 
    end 

    def curr 
    self.string[self.i] 
    end 

    def check(*sym) 
    throw 'syntax error' until sym.include?(self.next) 
    end 

    def check_curr(*sym) 
    throw 'syntax error' until sym.include?(self.curr) 
    end 
end 

def parse_string(str) 
    parse_hash(ParserIterator.new(str)) 
end 


def parse_hash(it) 
    it.check('{') 
    res={} 
    until it.curr=='}' 
    it.next if it.curr==',' 
    k,v=parse_pair(it) 
    res[k]=v 
    end 
    it.check('}') 
    res 
end 

def parse_pair(it) 
    key=it.read_until(':') 
    it.check(':') 
    value=(it.curr=='{' ? parse_hash(it) : it.read_until(',','}')) 
    return key,value 
end 
+0

非常感謝! – chucai

1

我會建議使用的ActiveSupport :: JSON.decode假設你有寶石可用還是願意把它列入你的寶石列表。

一個問題是要有JSON字符串。所以如果你有散列,你可以調用#to_json來獲得json字符串。例如這個作品:

str = '{"web":{"url":"http://www.example.com","toke":"somevalue"},"username":"person"}' 
ActiveSupport::JSON.decode(str) 
相關問題