Hướng dẫn parse nested json in python - phân tích cú pháp json lồng nhau trong python

Tôi đã được yêu cầu giúp phân tích tệp JSON được cung cấp bởi iTunes Store khách hàng đánh giá API JSON Endpoint. Nó không quá quan trọng làm thế nào API này hoạt động hoặc nếu có API tốt hơn cho việc này. Thay vào đó, hãy để cho rằng chúng tôi đã tìm thấy API yêu thích của mình để làm việc và yêu cầu của chúng tôi có ý nghĩa hoàn hảo và bây giờ chúng tôi phải đối phó với phản hồi API API, JSON trong trường hợp này. Bài viết này sẽ hướng dẫn bạn thông qua các bước cần thiết để phân tích phản hồi JSON này vào một gấu trúc

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
3. Tôi sẽ tập trung rất nhiều vào các khái niệm và phát triển mã và ít hơn vào việc giải thích từng dòng mã. Lý tưởng nhất, bạn nên quen thuộc với ít nhất một chút python và các loại dữ liệu tiêu chuẩn của nó, quan trọng nhất là từ điển.

Đầu tiên, tôi muốn hiểu những gì tôi đang xử lý và vì màn hình phản hồi JSON không quá tốt cho URL ban đầu, tôi sử dụng công cụ JSON giả vờ như http://jsonprettify.com/.

Điều này sẽ cho tôi phản hồi JSON được định dạng lại sau đây

{
    "feed": {
        "author": {
            "name": {
                "label": "iTunes Store"
            },
            "uri": {
                "label": "http://www.apple.com/uk/itunes/"
            }
        },
        "entry": [
            {
                "author": {
                    "uri": {
                        "label": "https://itunes.apple.com/gb/reviews/id1413855597"
                    },
                    "name": {
                        "label": "VedantJM"
                    },
                    "label": ""
                },
                "updated": {
                    "label": "2022-05-31T14:20:49-07:00"
                },
                "im:rating": {
                    "label": "5"
                },
                "im:version": {
                    "label": "2.38"
                },
                "id": {
                    "label": "8727815893"
                },
                "title": {
                    "label": "Brilliant"
                },
                "content": {
                    "label": "Adonissss",
                    "attributes": {
                        "type": "text"
                    }
                },
                "link": {
                    "attributes": {
                        "rel": "related",
                        "href": "https://itunes.apple.com/gb/review?id=1500780518&type=Purple%20Software"
                    }
                },
                "im:voteSum": {
                    "label": "0"
                },
                "im:contentType": {
                    "attributes": {
                        "term": "Application",
                        "label": "Application"
                    }
                },
                "im:voteCount": {
                    "label": "0"
                }
            },
            ...

Tôi chỉ hiển thị

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
4Object đầu tiên của
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
5List. Vì vậy, phản hồi JSON được cấu trúc theo cách sau:

  • Chúng tôi có một phần tử gốc duy nhất là nguồn cấp dữ liệu
  • Yếu tố gốc này chỉ có hai đứa con
  • Mục nhập của Nhật Bản là một danh sách các đối tượng và mỗi đối tượng có một tập hợp các thuộc tính như là tác giả của tác giả
  • Mỗi thuộc tính lại là một đối tượng JSON
  • Thuộc tính đơn giản nhất là một đối tượng chỉ có khóa nhãn hiệu và giá trị.
  • Các thuộc tính phức tạp hơn như tác giả "một lần nữa được lồng

Trước khi tôi đi sâu hơn về cách phân tích cấu trúc lồng nhau này, hãy để tôi thử phương pháp Pandas

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
6 trước.

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)

Đầu ra của điều này là bảng sau:

cho ăn
tác giả{‘Tên,: {‘ Nhãn
lối vào[{‘Tác giả,
biểu tượng{‘Nhãn hiệu:‘ http://itunes.apple.com/favicon.ico xông}
Tôi{‘Nhãn hiệu:‘ https: //mzstoreservice-int-st.itun
liên kết[{’Thuộc tính
quyền{Nhãn Nhãn: ‘Bản quyền 2008 Apple Inc.
Tiêu đề{Nhãn Nhãn: Cửa hàng iTunes: Đánh giá của khách hàng}
cập nhật{Nhãn Nhãn: ‘2022-06-02T11: 44: 53-07: 00 00}

Đây rõ ràng không phải là những gì tôi có trong tâm trí. Vấn đề đầu tiên tôi nên loại bỏ là gấu trúc không thể biết rằng tôi chỉ quan tâm đến danh sách của mục nhập, vì vậy trước tiên tôi sẽ tìm được phản hồi JSON, phân tích nó vào từ điển và truy cập vào giá trị của mục nhập của mục tiêu:

import requests

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"

r = requests.get(url)

data = r.json()
entries = data["feed"]["entry"]

Do đó,

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:

[{'author': {'label': '',
             'name': {'label': 'hdydgdbs'},
             'uri': {'label': 'https://itunes.apple.com/gb/reviews/id1351156521'}},
  'content': {'attributes': {'type': 'text'},
              'label': 'This meditation app is above all, it works and is '
                       'free, i reccomend it to everyone who wants to '
                       'meditate'},
  'id': {'label': '8730361700'},
  'im:contentType': {'attributes': {'label': 'Application',
                                    'term': 'Application'}},
  'im:rating': {'label': '5'},
  'im:version': {'label': '2.38'},
  'im:voteCount': {'label': '0'},
  'im:voteSum': {'label': '0'},
  'link': {'attributes': {'href': 'https://itunes.apple.com/gb/review?id=1500780518&type=Purple%20Software',
                          'rel': 'related'}},
  'title': {'label': 'Amazing app'},
  'updated': {'label': '2022-06-01T08:25:00-07:00'}},
  ...

Bây giờ, tôi có thể thử gấu trúc một lần nữa. Lưu ý rằng tôi không còn có chuỗi JSON mà là một danh sách python bình thường, chứa từ điển. Do đó, tôi có thể trực tiếp sử dụng gấu trúc

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
8 class:

df = pd.DataFrame(entries)

Các hàng đầu tiên của khung dữ liệu này trông như sau (

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
9):

tác giảcập nhậtim:ratingim:versionTôiTiêu đề{Nhãn Nhãn: Cửa hàng iTunes: Đánh giá của khách hàng}liên kếtim:voteSumim:contentTypeim:voteCount
0[{’Thuộc tínhquyền{Nhãn Nhãn: ‘Bản quyền 2008 Apple Inc.Tiêu đề{Nhãn Nhãn: Cửa hàng iTunes: Đánh giá của khách hàng}cập nhật{Nhãn Nhãn: ‘2022-06-02T11: 44: 53-07: 00 00}Đây rõ ràng không phải là những gì tôi có trong tâm trí. Vấn đề đầu tiên tôi nên loại bỏ là gấu trúc không thể biết rằng tôi chỉ quan tâm đến danh sách của mục nhập, vì vậy trước tiên tôi sẽ tìm được phản hồi JSON, phân tích nó vào từ điển và truy cập vào giá trị của mục nhập của mục tiêu:Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:
Bây giờ, tôi có thể thử gấu trúc một lần nữa. Lưu ý rằng tôi không còn có chuỗi JSON mà là một danh sách python bình thường, chứa từ điển. Do đó, tôi có thể trực tiếp sử dụng gấu trúc
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
8 class:
Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:
1[{’Thuộc tínhquyền{Nhãn Nhãn: ‘Bản quyền 2008 Apple Inc.Tiêu đề{Nhãn Nhãn: Cửa hàng iTunes: Đánh giá của khách hàng}cập nhật{Nhãn Nhãn: ‘2022-06-02T11: 44: 53-07: 00 00}Đây rõ ràng không phải là những gì tôi có trong tâm trí. Vấn đề đầu tiên tôi nên loại bỏ là gấu trúc không thể biết rằng tôi chỉ quan tâm đến danh sách của mục nhập, vì vậy trước tiên tôi sẽ tìm được phản hồi JSON, phân tích nó vào từ điển và truy cập vào giá trị của mục nhập của mục tiêu:Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:
Bây giờ, tôi có thể thử gấu trúc một lần nữa. Lưu ý rằng tôi không còn có chuỗi JSON mà là một danh sách python bình thường, chứa từ điển. Do đó, tôi có thể trực tiếp sử dụng gấu trúc
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
8 class:
Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:
2[{’Thuộc tínhquyền{Nhãn Nhãn: ‘Bản quyền 2008 Apple Inc.Tiêu đề{Nhãn Nhãn: Cửa hàng iTunes: Đánh giá của khách hàng}cập nhật{Nhãn Nhãn: ‘2022-06-02T11: 44: 53-07: 00 00}Đây rõ ràng không phải là những gì tôi có trong tâm trí. Vấn đề đầu tiên tôi nên loại bỏ là gấu trúc không thể biết rằng tôi chỉ quan tâm đến danh sách của mục nhập, vì vậy trước tiên tôi sẽ tìm được phản hồi JSON, phân tích nó vào từ điển và truy cập vào giá trị của mục nhập của mục tiêu:Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:
Bây giờ, tôi có thể thử gấu trúc một lần nữa. Lưu ý rằng tôi không còn có chuỗi JSON mà là một danh sách python bình thường, chứa từ điển. Do đó, tôi có thể trực tiếp sử dụng gấu trúc
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
8 class:
Do đó,
import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
7 trông như thế này:

Bây giờ, tôi có thể thử gấu trúc một lần nữa. Lưu ý rằng tôi không còn có chuỗi JSON mà là một danh sách python bình thường, chứa từ điển. Do đó, tôi có thể trực tiếp sử dụng gấu trúc

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
8 class:

Các hàng đầu tiên của khung dữ liệu này trông như sau (

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
9):

Nội dung

parsed_data = defaultdict(list)

for entry in entries:
    parsed_data["author_uri"].append(entry["author"]["uri"]["label"])
    parsed_data["author_name"].append(entry["author"]["name"]["label"])
    parsed_data["author_label"].append(entry["author"]["label"])
    parsed_data["content_label"].append(entry["content"]["label"])
    parsed_data["content_attributes_type"].append(entry["content"]["attributes"]["type"])
    ... 
                    

{‘Uri,: {‘ nhãn

pd.DataFrame(parsed_data)

Đầu ra sẽ là khung dữ liệu như thế này:

author_uriauthor_nameauthor_labelcontent_labelcontent_attributes_type
0https://itunes.apple.com/gb/reviews/id1351156521HDYDGDBS Ứng dụng thiền này trên hết, nó hoạt động vàchữ
1https://itunes.apple.com/gb/reviews/id1413855597VedantJM Adonisssschữ
2https://itunes.apple.com/gb/reviews/id1413855597VedantJM Adonisssschữ

https://itunes.apple.com/gb/reviews/id1413855597

parsed_data = defaultdict(list)

for entry in entries:
    for key, val in entry.items():
        for subkey, subval in val.items():
            if not isinstance(subval, dict):
                parsed_data[f"{key}_{subkey}"].append(subval)
            else:
                for att_key, att_val in subval.items():
                    parsed_data[f"{key}_{subkey}_{att_key}"].append(att_val)

VedantJM

Adonissss

df = pd.DataFrame(parsed_data)
df.head()

https://itunes.apple.com/gb/reviews/id1413779831

author_uri_labelauthor_name_labelauthor_labelupdated_labelim:rating_labelim:version_labelid_labeltitle_labelcontent_labelcontent_attributes_typelink_attributes_rellink_attributes_hrefim:voteSum_labelim:contentType_attributes_termim:contentType_attributes_labelim:voteCount_label
0https://itunes.apple.com/gb/reviews/id1351156521HDYDGDBS Ứng dụng thiền này trên hết, nó hoạt động và5 2.38 8730361700 chữỨng dụng thiền này trên hết, nó hoạt động vàchữhttps://itunes.apple.com/gb/reviews/id1413855597VedantJM0 AdonissssAdonissss0
1https://itunes.apple.com/gb/reviews/id1413855597VedantJM Adonissss5 2.38 8727815893 https://itunes.apple.com/gb/reviews/id1413779831Adonisssschữhttps://itunes.apple.com/gb/reviews/id1413855597VedantJM0 AdonissssAdonissss0
2https://itunes.apple.com/gb/reviews/id1413855597VedantJM Adonissss5 2.38 8726950116 https://itunes.apple.com/gb/reviews/id1413779831Adonisssschữhttps://itunes.apple.com/gb/reviews/id1413855597VedantJM0 AdonissssAdonissss0

https://itunes.apple.com/gb/reviews/id1413779831

df.columns = [col if not "label" in col else "_".join(col.split("_")[:-1]) for col in df.columns]

dtnvcgiifgh

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
0

Ứng dụng này là ứng dụng cho thiền, tuyệt vời SEL

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
1

Tuy nhiên, nhắm đến một giải pháp tổng quát hơn có thể tự động giải quyết với tất cả các thuộc tính/thuộc tính mà không biết cấu trúc (nhưng dựa vào thực tế là chỉ có hai cấp độ từ điển lồng nhau, ít nhất là bây giờ), tôi đã lấy được giải pháp sau:

Mã không phải là mã đẹp nhất nhưng tôi sẽ đến với điều này sau. Bây giờ, hãy để tập trung vào ý định: Đối với mỗi mục, tôi nhìn vào cặp giá trị khóa đầu tiên, biết rằng giá trị luôn là một từ điển (đối tượng trong JSON). Bây giờ tôi phải đối phó với hai trường hợp khác nhau. Trong trường hợp đầu tiên, từ điển giá trị phẳng và không chứa từ điển khác, chỉ có các cặp giá trị khóa. Đây là trường hợp đơn giản trong đó tôi kết hợp phím bên ngoài với phím bên trong với tên cột và lấy giá trị làm giá trị cột cho mỗi cặp. Trong trường hợp thứ hai, từ điển chứa một cặp giá trị khóa trong đó giá trị lại là một từ điển. Tôi dựa vào thực tế là có tối đa hai cấp độ từ điển lồng nhau nên tôi lặp lại các cặp giá trị khóa của từ điển bên trong và một lần nữa kết hợp phím bên ngoài và phím bên trong nhất với tên cột và lấy giá trị bên trong làm cột giá trị.

import pandas as pd

url = "https://itunes.apple.com/gb/rss/customerreviews/id=1500780518/sortBy=mostRecent/json"
pd.read_json(url)
2

Đó là một vẻ đẹp! Giống như thường khi một cách tiếp cận đệ quy là tự nhiên hơn đối với nhiệm vụ, việc thực hiện đệ quy dễ đọc hơn và thường ngắn hơn so với phương pháp lặp. Bạn có thể tự xác minh rằng khung dữ liệu thu được từ phương pháp này giống hệt với khung dữ liệu thu được từ giải pháp lặp trước đó.

Tất nhiên có những cách tiếp cận khác. Một chiến lược phổ biến là làm phẳng JSON ban đầu bằng cách làm một cái gì đó rất giống như chúng ta đã làm ở đây: rút ra tất cả các đối tượng lồng nhau bằng cách kết hợp tất cả các phím và giữ giá trị bên trong cuối cùng. Nếu bạn thay đổi JSON ban đầu như thế này, bạn có được một JSON có thể được đưa trực tiếp vào gấu trúc. Thậm chí còn có một mô -đun bạn có thể sử dụng ngay trong hộp: Flatten_Json. Nhưng nơi nào sẽ là niềm vui trong trò chơi này

Tôi hy vọng bạn thích theo dõi tôi trên hành trình nhỏ này và như mọi khi tôi mở cho những bình luận, thảo luận và câu hỏi của bạn.


Giữ bình tĩnh và mã trong Python!

Làm cách nào để đọc một tệp JSON lồng nhau trong Python?

Python đã tích hợp các chức năng dễ dàng nhập các tệp JSON dưới dạng từ điển Python hoặc DataFrame của Pandas. Sử dụng PD. read_json () để tải jsons đơn giản và pd.json_normalize () để tải jsons lồng nhau.pd. json_normalize() to load nested JSONs.

Làm thế nào để bạn phân tích một json trong Python?

Nếu bạn có chuỗi JSON, bạn có thể phân tích nó bằng cách sử dụng phương thức JSON.LOADS ().Kết quả sẽ là một từ điển Python.using the json. loads() method. The result will be a Python dictionary.

Làm cách nào để lọc dữ liệu JSON lồng nhau trong Python?

JSON "với Open (pathtofile, 'r') dưới dạng tệp: content = file. Đọc () # Chuyển đổi json_data sang định dạng từ điển python json_data = json.] cho mục nhập trong json_data: nếu mục nhập ["lớp"] == removeNentryClass và entry ["data"] ['id']! =

Làm cách nào để xử lý JSON lồng nhau?

Một jsonarray có thể phân tích văn bản từ một chuỗi để tạo ra một đối tượng giống như vector.Chúng ta có thể phân tích một đối tượng JSON lồng nhau bằng phương pháp getString (index) của jsonarray.Đây là một phương pháp tiện lợi cho getjsonstring (index).phương thức getString () và nó trả về một giá trị chuỗi tại vị trí được chỉ định.using the getString(index) method of JSONArray. This is a convenience method for the getJSONString(index). getString() method and it returns a string value at the specified position.