2017-04-12 26 views
1

我使用fluentd来分析日志,它看起来像:如何解析ruby中不标准JSON的字符串?

{ date="2017-04-01 10:22:18.306", message="This is a trace Message!" } 
{ date="2017-04-01 10:22:18.306", message="This is a debug message" } 

虽然标准化的JSON版本应该是:

{ "date":"2017-04-01 10:22:18.306", "message":"This is a trace Message!" } 

我已经试过

str='{ date="2017-04-01 10:22:18.306", message="This is a trace Message!" }' 
Yajl::Parser.parse(str) 

而且它不工作:

Yajl::ParseError: lexical error: invalid char in json text. 
            { date="2017-04-01 10:22:18.306", 
        (right here) ------^ 

    from /var/lib/gems/2.3.0/gems/yajl-ruby-1.2.1/lib/yajl.rb:37:in `parse' 
    from /var/lib/gems/2.3.0/gems/yajl-ruby-1.2.1/lib/yajl.rb:37:in `parse' 
    from (irb):45 
    from /usr/bin/irb:11:in `<main>' 
+0

@EricDuminil我已经更新 – Pao

+0

@Pao:什么是你从你的代码得到的结果? – Surya

回答

1

你可以使用scan用正则表达式:

data = %q(
{ date="2017-04-01 10:22:18.306", message="This is a trace Message!" } 
{ date="2017-04-01 10:22:18.306", message="This is a debug message" } 
) 

pattern = /date="([^"]+)", message="([^"]+)"/ 

messages = data.scan(pattern).map{ |date, message| 
    {date: date, message: message} 
} 

p messages 
# [{:date=>"2017-04-01 10:22:18.306", :message=>"This is a trace Message!"}, {:date=>"2017-04-01 10:22:18.306", :message=>"This is a debug message"}]