2014-01-28 192 views
0

我有些不好产生的内部JSON如:红宝石解析JSON括号

p_response({ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "(ISO 8879:1986)", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
}) 

我如何解析p_response括号内的Json的?我无法使用gsub,因为JSON正文中可能有括号。

+0

如果你在Ruby中运行它,是不是传递给'p_response'而不是JSON的Ruby Hash? Ruby 1.9+哈希看起来类似于JSON,但它们不是JSON。 – tjdett

+0

上述响应是web服务响应。 – Yogzzz

+0

如果它封装在'p_response'中,那么它更可能是JSONP。 – tjdett

回答

1

结果是JSONP。

只要删除前导p_response(和尾随)。然后,你可以分析它的JSON:

jsonp = <<JSONP 
p_response({ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "(ISO 8879:1986)", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
}) 
JSONP 

require 'json' 
json = jsonp.gsub(/\Ap_response\(|\)\Z/, '') 
# OR = jsonp.gsub(/\A\w+\(|\)\Z/, '') 
puts JSON.parse(json) 

# \A - Matches beginning of string. 
# \Z - Matches end of string. If string ends with a newline, it matches just before newline 

输出:

{"glossary"=>{"title"=>"example glossary", "GlossDiv"=>{"title"=>"S", "GlossList"=>{"GlossEntry"=>{"ID"=>"SGML", "SortAs"=>"SGML", "GlossTerm"=>"Standard Generalized Markup Language", "Acronym"=>"SGML", "Abbrev"=>"(ISO 8879:1986)", "GlossDef"=>{"para"=>"A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso"=>["GML", "XML"]}, "GlossSee"=>"markup"}}}}}

0
json_str = '{ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "(ISO 8879:1986)", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
}' 

require 'json' 
j = JSON.parse json_str 
0

你的反应是JSONP。假设p_response总是用作callback function,并假设x包含Web服务响应:

x.sub(/^\s*p_response\(/, "").sub(/\)\s*$/,"")

,将让你用干净的JSON解析,而不是JSONP。