2012-09-10 61 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) 
相关问题