2012-09-10 1 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"} 

파서 코드 : 나는 당신이 사용할 수있는 보석이 있거나 보석 목록에 포함하고자하는 가정 ActiveSupport :: JSON.decode를 사용하는 것이 좋습니다

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

.

하나의 잡화는 json 문자열을 갖는 것입니다. 해시가 있으면 #to_json을 호출하여 json 문자열을 얻을 수 있습니다. 예를 들어 다음과 같습니다.

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