Как разобрать очищенную строку JSON - PullRequest
1 голос
/ 26 декабря 2011

Мне нужно получить значения строки JSON, хранящейся внутри функции, в теге скрипта, например:

<script type="text/javascript">
    my.function("bar", {"foo1": false, "foo2": true, "foo3": "foobar!"});
</script>

Я могу добраться до конкретного тега, используя Mechanize, вот так:

parser.xpath("//script[ contains(text(), 'my.function')]").text

но я не знаю, как дальше. Как извлечь часть строки JSON и преобразовать ее в хеш, чтобы можно было извлечь значения?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2011

Вот чистое решение XPath 1.0 :

Используйте

concat('{',
       substring-before(
               substring-after(
                   substring-after(., 'my.function('),
                  '{'
                               ),
               ');'
                        )
       )

XSLT - проверка на основе :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "concat('{',
           substring-before(
                   substring-after(
                       substring-after(., 'my.function('),
                      '{'
                                   ),
                   ');'
                            )
           )
   "/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<script type="text/javascript">
 my.function("bar", {"foo1": false, "foo2": true, "foo3": "foobar!"});
</script>

Вычисляется выражение XPath (выше) и выводится результат :

{"foo1": false, "foo2": true, "foo3": "foobar!"}
1 голос
/ 26 декабря 2011

Если форма не меняется, вы можете сделать

JSON.parse(/\{.*\}/.match(txt)[0])

с json gem.Имейте в виду, что есть несколько точек отказа - либо проверяйте каждый шаг, либо помещайте где-нибудь хороший rescue.

...