Как получить определенные элементы, используя jsonpath + Python? - PullRequest
1 голос
/ 01 ноября 2019

У меня есть файл с именем source.json, содержимое:

{
    "msg": "OK",
    "result": {
        "data": {
            "articles": [
                {
                    "idtArticle": "CF00002",
                    "promotionService": {
                        "bundleSales": [
                            {
                                "code": "201900001"
                            },
                            {
                                "code": "201900002"
                            }
                        ]
                    }
                },
                {
                    "idtArticle": "CF00003",
                    "promotionService": {
                        "bundleSales": [
                            {
                                "code": "201900001"
                            },
                            {
                                "code": "201900003"
                            }
                        ]
                    }
                }
            ]
        }
    }
}

У меня есть следующий код Python:

import json
import jsonpath

json_source = 'source.json'

with open(json_source, encoding='utf-8') as f:
    root = json.loads(f.read())

if __name__ == "__main__":
    result = jsonpath.jsonpath(root, """$..articles[?(@.idtArticle == "CF00002")]""")
    print(result)

Код работает, и я могу получить статью, чейidtArticle - CF00002, но как получить список статей, чей код (или один из 2 кодов) - 201900001?

Оцените все подсказки!

1 Ответ

1 голос
/ 01 ноября 2019

jsonpath не поддерживает проекции , поэтому я бы сделал то, что вы хотите в простом Python.

import json

json_source = 'source.json'
with open(json_source, encoding='utf-8') as f:
    root = json.loads(f.read())

if __name__ == "__main__":
    articles = root['result']['data']['articles']
    result = []
    for article in articles:
        bundleSales = article['promotionService']['bundleSales']
        for bundleSale in bundleSales:
            if bundleSale['code'] == "201900001":
                result.append(article['idtArticle'])
    print(result)

Вы можете проверить это на расширенном примере:

{
    "msg": "OK",
    "result": {
        "data": {
            "articles": [
                {
                    "idtArticle": "CF00002",
                    "promotionService": {
                        "bundleSales": [
                            {
                                "code": "201900001"
                            },
                            {
                                "code": "201900002"
                            }
                        ]
                    }
                },
                {
                    "idtArticle": "CF00003",
                    "promotionService": {
                        "bundleSales": [
                            {
                                "code": "201900001"
                            },
                            {
                                "code": "201900003"
                            }
                        ]
                    }
                },
                {
                    "idtArticle": "CF00004",
                    "promotionService": {
                        "bundleSales": [
                            {
                                "code": "201900002"
                            },
                            {
                                "code": "201900003"
                            }
                        ]
                    }
                }
            ]
        }
    }
}

Он печатает ['CF00002', 'CF00003'].

...