Регулярное выражение для сопоставления пар ключ-значение из JSON

#json #regex

#java #json #регулярное выражение

Вопрос:

Мне нужно сопоставить все пары значений ключей из сложного JSON, но только значения, которые являются текстовыми / строковыми.

Например, из:

 {"results":[
{"id":16,"name":"some name1","location":"some  location1","parent":true, ,"region":"some region"},
{"id":157,"name":"some name2" , "location":some location2","parent":true}
],"totalCount":170}
 

Мне нужно сопоставить:

 "name" 
"some name1"
"location"
"some location1"
"region"
"some region1"
etc
 

У меня есть это [^:] "(?=[,}s]|$) , но оно соответствует только значениям (которые являются правильными).

Мне также нужно сопоставить ключи: «имя», «местоположение», «регион» (и могут быть другие имена ключей)

Вот пример сопоставления значений https://regex101.com/r/m8FePZ/6

Комментарии:

1. Нужно ли вам использовать регулярное выражение? В 99,9% случаев вам не следует использовать регулярные выражения для анализа чего-либо в стандартизированном машиночитаемом формате, таком как JSON (или HTML, XML и т. Д.). Вы должны использовать собственный синтаксический анализатор JSON вашего языка программирования. На каком языке / в какой среде вы работаете?

2. Просто из любопытства: почему бы просто не разобрать и не перебрать ключи? Микрооптимизация? Или иметь дело с безумно огромным набором данных?

3. Не пытайтесь анализировать JSON с помощью регулярного выражения. Позже ты пожалеешь об этом. Есть так много крайних случаев и вещей, которые могут пойти не так, о чем вы даже не подумали. Используйте правильный синтаксический анализатор JSON на любом языке, который вы используете.

4. Если вы делаете что-то из оболочки, тогда посмотрите на такой инструмент, как jq . Вот статья , которую я написал, которая включает в себя краткий пример того, как jq можно использовать.

5. Спасибо за комментарии. Я использую JAVA, но я мог бы сделать это на любом языке. Данные не являются критическими, если что-то пойдет не так с регулярным выражением (только для целей тестирования). Я хочу создать небольшой скрипт, который анализирует любые многоуровневые объекты json и запутывает значения, добавляя вместо этого ключ и случайное число. Неизвестно, что будет содержать JSON. Я изучал разные библиотеки, но ни одна из них не помогла мне достичь этого, и, например, синтаксический анализ с помощью Jackson и преобразование его в Map подразумевали переход на все уровни внутри JSON, что может быть немного сложным.

Ответ №1:

Как указывали другие, если вам нужно надежное решение, используйте анализатор JSON на вашем языке.

Если вы хотите использовать регулярное выражение, а движок поддерживает поиск сзади, вы можете использовать это:

 /("[^"]*"(?=:")|(?<=":)"[^"]*")/g
 

Объяснение:

  • | — или комбинация из:
    • "[^"]*"(?=:") — цитата, 0 без кавычек, цитата, за которой следует положительный прогноз для двоеточия и кавычки
    • (?<=":)"[^"]*" — положительный поиск позади цитаты и двоеточия, за которым следует цитата, 0 без кавычек, цитата

Если вы хотите исключить кавычки в совпадениях, используйте это регулярное выражение:

 /(?<=")([^"]*(?=":")|(?<=":")[^"]*)/g
 

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