#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.