我很難找到一種正確的方法來從我擁有的 JSON 中列印我的結果。
我搜索了很多小時,但沒有成功找到答案。
這是我擁有的 JSNO:
json = \
{
"Envelope": {
"Body": {
"GetCTProductsResponse": {
"GetCTProductsResult": {
"CTPRODUCT": [
{
"CODE": "TESLAAIR3",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Tesla Air purifier AIR 3",
"MANUFACTURER": "Tesla",
"MANUFACTURERCODE": "TESLA",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "69,9000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "24M",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": ""
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093216482.jpg"
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093216098.jpg"
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093215238.jpg"
},
{
"CODE": "BHR4802GL",
"PRODUCTGROUPCODE": "ZVUCNICI",
"NAME": "Xiaomi Mi Portable Bluetooth Speaker Grey",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "17,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/BHR4802GL_1.jpg"
}
]
}
}
}
}
}
使用 Python,我想訪問CODE變數 ( "CODE": "TESLAAIR3")
我嘗試了很多東西,轉儲,加載,加載等,但沒有解決我的問題。
謝謝你。
uj5u.com熱心網友回復:
你可以試試:
a["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][0]["CODE"]
uj5u.com熱心網友回復:
這將列印出所有代碼:
for code in test["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"]:
print(code["CODE"])
uj5u.com熱心網友回復:
執行此操作的另一種方法如下:
data = {
"Envelope": {
"Body": {
"GetCTProductsResponse": {
"GetCTProductsResult": {
"CTPRODUCT": [
{
"CODE": "TESLAAIR3",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Tesla Air purifier AIR 3",
"MANUFACTURER": "Tesla",
"MANUFACTURERCODE": "TESLA",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "69,9000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "24M",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": ""
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093216482.jpg"
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093216098.jpg"
},
{
"CODE": "SKV4140GL",
"PRODUCTGROUPCODE": "AIRPURIF",
"NAME": "Xiaomi MI SMART Antibacterial humidifier",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "39,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/SKV4140GL_201117093215238.jpg"
},
{
"CODE": "BHR4802GL",
"PRODUCTGROUPCODE": "ZVUCNICI",
"NAME": "Xiaomi Mi Portable Bluetooth Speaker Grey",
"MANUFACTURER": "Xiaomi",
"MANUFACTURERCODE": "XIAOMI",
"QTTYINSTOCK": ">20",
"TAX": 21,
"PRICE": "17,0000",
"RETAILPRICE": 0,
"SHORT_DESCRIPTION": "",
"WARRANTY": "2G",
"EUR_ExchangeRate": "0,00",
"BARCODE": "",
"IMAGE_URL": "http://www.ct4partners.ba/UploadDownload/ProductImages/BHR4802GL_1.jpg"
}
]
}
}
}
}
}
和
import pandas as pd
import json
json_object = json.dumps(data)
results = pd.json_normalize(data)
現在,定義以下函式:
def flatten_nested_json_df(df):
df = df.reset_index()
s = (df.applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df.applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
while len(list_columns) > 0 or len(dict_columns) > 0:
new_columns = []
for col in dict_columns:
horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
horiz_exploded.index = df.index
df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
new_columns.extend(horiz_exploded.columns) # inplace
for col in list_columns:
#print(f"exploding: {col}")
df = df.drop(columns=[col]).join(df[col].explode().to_frame())
new_columns.append(col)
s = (df[new_columns].applymap(type) == list).all()
list_columns = s[s].index.tolist()
s = (df[new_columns].applymap(type) == dict).all()
dict_columns = s[s].index.tolist()
return df
并這樣做:
results = pd.json_normalize(data)
flatten_nested_json_df(results)
它回傳一個 df ,您可以從中選擇您想要的任何內容:
index \
0 0
0 0
0 0
0 0
0 0
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.CODE \
0 TESLAAIR3
0 SKV4140GL
0 SKV4140GL
0 SKV4140GL
0 BHR4802GL
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.PRODUCTGROUPCODE \
0 AIRPURIF
0 AIRPURIF
0 AIRPURIF
0 AIRPURIF
0 ZVUCNICI
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.NAME \
0 Tesla Air purifier AIR 3
0 Xiaomi MI SMART Antibacterial humidifier
0 Xiaomi MI SMART Antibacterial humidifier
0 Xiaomi MI SMART Antibacterial humidifier
0 Xiaomi Mi Portable Bluetooth Speaker Grey
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.MANUFACTURER \
0 Tesla
0 Xiaomi
0 Xiaomi
0 Xiaomi
0 Xiaomi
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.MANUFACTURERCODE \
0 TESLA
0 XIAOMI
0 XIAOMI
0 XIAOMI
0 XIAOMI
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.QTTYINSTOCK \
0 >20
0 >20
0 >20
0 >20
0 >20
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.TAX \
0 21
0 21
0 21
0 21
0 21
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.PRICE \
0 69,9000
0 39,0000
0 39,0000
0 39,0000
0 17,0000
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.RETAILPRICE \
0 0
0 0
0 0
0 0
0 0
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.SHORT_DESCRIPTION \
0
0
0
0
0
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.WARRANTY \
0 24M
0 2G
0 2G
0 2G
0 2G
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.EUR_ExchangeRate \
0 0,00
0 0,00
0 0,00
0 0,00
0 0,00
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.BARCODE \
0
0
0
0
0
Envelope.Body.GetCTProductsResponse.GetCTProductsResult.CTPRODUCT.IMAGE_URL
0
0 http://www.ct4partners.ba/UploadDownload/Produ...
0 http://www.ct4partners.ba/UploadDownload/Produ...
0 http://www.ct4partners.ba/UploadDownload/Produ...
0 http://www.ct4partners.ba/UploadDownload/Produ...
它還具有向您顯示列名中所需內容的路徑的優點,以便:
data['Envelope']['Body']['GetCTProductsResponse']['GetCTProductsResult']['CTPRODUCT'][0]['CODE']
uj5u.com熱心網友回復:
我建議考慮物件的結構。這是有點過度確定的代碼,但它會幫助您更快地識別任何錯誤:
import json
json_string = {} # Your whole json file from the question
ctproducts = None
try:
ct_products_object = json.loads(json_string)
ct_envelope = ct_products_object.get("Envelope") # See below
ct_body = ct_envelope.get("Body")
get_ct_products = ct_body.get("GetCTProductsResponse")
get_ct_result = get_ct_products.get("GetCTProductsResult")
ctproducts = get_ct_result.get("CTPRODUCT")
except json.JSONDecodeError as e:
print(f"This is not a valid JSON file because {str(e)}")
# Not a json file, handle that
except AttributeError as e:
print(str(e))
# You got one of the keys wrong, handle that.
if ctproducts:
for ctproduct in ctproducts:
code = ctproduct.get("CODE")
print(f"CODE: {code}")
看起來好像您實際上并未在代碼中獲取 JSON 檔案的根目錄,因此您可能想要跳過 ct_envelope 并使用ct_body = ct_products_object.get("Body"). 如果拋出 AttributeError,請嘗試get_ct_products = ct_products_object.get("GetCTProductsResponse")等等,直到找到物件的哪一部分是當前物件的根。
uj5u.com熱心網友回復:
您可以撰寫一個函式find_json,該函式為您提供第一次出現鍵“CODE”的路徑及其值:
def find_json(key, json, acc=[]):
if type(json) == list:
for i, x in enumerate(json):
if type(x) == list or type(x) == dict:
return find_json(key, x, acc [i])
elif type(json) == dict:
for k, v in json.items():
if k == key:
return acc [k], v
elif type(v) == list or type(v) == dict:
return find_json(key, json[k], acc [k])
你運行的:
find_json('CODE', json)
# returning the path to the first 'CODE' in `json` and the value:
(['Envelope',
'Body',
'GetCTProductsResponse',
'GetCTProductsResult',
'CTPRODUCT',
0,
'CODE'],
'TESLAAIR3')
我們可以通過為第一個呼叫生成代碼來改進輸出CODE:
from functools import reduce
def path_to_code(lst, dict_name="json"):
return reduce(lambda x,y: f"{x}[\"{y}\"]" if type(y) == str else f"{x}[{y}]", lst, dict_name)
def find_json(key, json, acc=[]):
if type(json) == list:
for i, x in enumerate(json):
if type(x) == list or type(x) == dict:
return find_json(key, x, acc [i])
elif type(json) == dict:
for k, v in json.items():
if k == key:
return path_to_code(acc [k], "json"), v
elif type(v) == list or type(v) == dict:
return find_json(key, json[k], acc [k])
find_json('CODE', json)
# which outputs:
('json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][0]["CODE"]',
'TESLAAIR3')
最后,要在此 json 中找到“CODE”鍵的所有路徑:
from functools import reduce
def path_to_code(lst, dict_name="json"):
return reduce(lambda x,y: f"{x}[\"{y}\"]" if type(y) == str else f"{x}[{y}]", lst, dict_name)
def find_all_json(key, json):
res = []
def _find_all_json(key, json, acc=[]):
nonlocal res
if type(json) == list:
for i, x in enumerate(json):
if type(x) == list or type(x) == dict:
_find_all_json(key, x, acc [i])
elif type(json) == dict:
for k, v in json.items():
if k == key:
res = res [{"cmd": path_to_code(acc [k], "json"), "val": v}]
if type(v) == list or type(v) == dict:
_find_all_json(key, v, acc [k])
_find_all_json(key, json)
return res
find_all_json('CODE', json)
# [{'cmd': 'json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][0]["CODE"]',
# 'val': 'TESLAAIR3'},
# {'cmd': 'json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][1]["CODE"]',
# 'val': 'SKV4140GL'},
# {'cmd': 'json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][2]["CODE"]',
# 'val': 'SKV4140GL'},
# {'cmd': 'json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][3]["CODE"]',
# 'val': 'SKV4140GL'},
# {'cmd': 'json["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][4]["CODE"]',
# 'val': 'BHR4802GL'}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/388864.html
