2014-01-28 5 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" 
       } 
      } 
     } 
    } 
}) 

Как я могу разобрать JSON в пределах p_response скобки? Я не могу использовать gsub, потому что тело JSON может иметь в себе круглые скобки.

+0

Если вы используете это в Ruby, разве это не Ruby Hash, которое передается 'p_response', а не JSON? Хеши Ruby 1.9+ похожи на JSON, но они не JSON. – tjdett

+0

Ответ выше - ответ webservice. – 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 содержит ваш ответ веб-службы:

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

Это оставит вас с чистой JSON для синтаксического анализа, а не JSONP.

Смежные вопросы