0

これは私のひもです

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

次のように、それをハッシュに変換したい:

```

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

```

4

3 に答える 3

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
于 2012-09-10T13:02:12.407 に答える
1

利用可能なgemがあるか、gemリストに含める意思がある場合は、ActiveSupport::JSON.decodeを使用することをお勧めします。

1つの落とし穴は、jsonの文字列を持つことです。したがって、ハッシュがある場合は、#to_jsonを呼び出してjson文字列を取得できます。たとえば、これは機能します。

str = '{"web":{"url":"http://www.example.com","toke":"somevalue"},"username":"person"}'
ActiveSupport::JSON.decode(str)
于 2012-09-10T15:26:35.490 に答える
1

カスタムパーサーを作成する必要があります。ほぼjsonですが、値が引用符で囲まれていないため、JSONパーサーでは解析されないため、引用符で囲まれた値を取得できない場合は、手動で解析する必要があります.

値内のコロン、コンマ、および中括弧の処理は困難です。

于 2012-09-10T12:02:13.430 に答える