Извлечение JSON из строки, используя дротик флаттера - PullRequest
0 голосов
/ 13 марта 2020

Здравствуйте, я хочу извлечь JSON из нижеприведенной строки ввода.

Я пробовал приведенное ниже регулярное выражение в java и работает нормально,

private static final Pattern shortcode_media = Pattern.compile("\"shortcode_media\":(\\{.+\\})");

Я хочу в регулярном выражении для дротика.

Строка ввода

<script type="text/javascript">window.__initialDataLoaded(window._sharedData);</script><script type="text/javascript">window.__additionalDataLoaded('/p/B9fphP5gBeG/',{"graphql":{"shortcode_media":{"__typename":"GraphSidecar","id":"2260708142683789190","shortcode":"B9fphP5gBeG","dimensions":{"height":1326,"width":1080}}}});</script><script type="text/javascript">
<script type="text/javascript">window.__initialDataLoaded(window._newData);</script><script type="text/javascript">window._newData('/p/B9fphP5gBeG/',{"graphql":{"post":{"__typename":"id","id":"2260708142683789190","new_code":"B9fphP5gBeG"}}});</script><script type="text/javascript">

(function(){
  function normalizeError(err) {
    var errorInfo = err.error || {};
    var getConfigProp = function(propName, defaultValueIfNotTruthy) {
      var propValue = window._sharedData && window._sharedData[propName];
      return propValue ? propValue : defaultValueIfNotTruthy;
    };
    return {}
  }
)

Ожидается json

{"graphql":{"shortcode_media":{"__typename":"GraphSidecar","id":"2260708142683789190","shortcode":"B9fphP5gBeG","dimensions":{"height":1326,"width":1080}}}}

Примечание: В строке ввода есть несколько json строк, мне нужно json из shortcode_media tag

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Соответствующий Dart RegExp будет:

static final RegExp shortcodeMedia = RegExp(r'"shortcode_media":(\{.+\})");

Хотя это не работает. JSON не является обычным языком, поэтому вы не можете разобрать его с помощью регулярных выражений.

Значение "shortcode_media" в вашем примере JSON заканчивается несколькими } символами. RegExp остановит матч на третьем из них, даже если второй } соответствует первому {. Если ваш текст JSON содержит какие-либо дополнительные значения после записи shortcode_media, они также могут быть включены.

Остановка на первом } также будет слишком короткой. Если кто-то переупорядочит исходный код JSON на эквивалентный

"shortcode_media":{"dimensions":{"height":1326,"width":1080},"__typename":"GraphSidecar","id":"2260708142683789190","shortcode":"B9fphP5gBeG"}

(то есть, поставив запись "dimensions" на первом месте), то вы будете захватывать только до конца блока измерений.

Я бы порекомендовал либо использовать правильный JSON синтаксический анализатор, либо, по крайней мере, улучшить RegExp, чтобы иметь возможность обрабатывать один вложенный JSON объект - поскольку вы, похоже, уже знаете, что это произойдет. Такой RegExp может быть:

RegExp(r'"shortcode_media":(\{(?:[^{}]*(?:\{.*?\})?)*?\})')

Этот RegExp будет захватывать правильное количество фигурных скобок для примера кода, но все равно не будет работать, если есть больше вложенных JSON объектов. Только настоящий парсер может правильно обрабатывать общий случай.

0 голосов
/ 13 марта 2020

используйте

void main() {
​
  String json = '''
  {"graphql":
{"shortcode_media":{"__typename":"GraphSidecar","id":"2260708142683789190","shortcode":"B9fphP5gBeG","dimensions":{"height":1326,"width":1080}}},
"abc":{"def":"test"}    
}
  ''';

  RegExp regExp = new RegExp(
  "\"shortcode_media\":(\\{.+\\})",
  caseSensitive: false,
  multiLine: false,
);

  print(regExp.stringMatch(json).toString());


}

выход

"shortcode_media":{"__typename":"GraphSidecar","id":"2260708142683789190","shortcode":"B9fphP5gBeG","dimensions":{"height":1326,"width":1080}}}

Дартпад

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...