首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python访问嵌套JSON

使用python访问嵌套JSON
EN

Stack Overflow用户
提问于 2021-12-21 14:05:44
回答 5查看 68关注 0票数 -1

我很难从我的JSON中找到一种正确的方法来打印我的结果。

我找了好几个小时,但没有找到答案。

以下是我所拥有的JSNO:

代码语言:javascript
复制
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": "TESLAAIR3")

我尝试了很多东西,转储,负载,负载等等,但没有解决我的问题。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-12-21 14:08:33

你可以试试:

代码语言:javascript
复制
a["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"][0]["CODE"]
票数 2
EN

Stack Overflow用户

发布于 2021-12-21 14:10:02

这将打印出所有代码:

代码语言:javascript
复制
for code in test["Envelope"]["Body"]["GetCTProductsResponse"]["GetCTProductsResult"]["CTPRODUCT"]:
    print(code["CODE"])
票数 0
EN

Stack Overflow用户

发布于 2021-12-21 14:22:18

另一种这样做的方法是:

代码语言:javascript
复制
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"
            }
          ]
        }
      }
    }
  }
}

代码语言:javascript
复制
import pandas as pd
import json
json_object = json.dumps(data)
results = pd.json_normalize(data)

现在,定义以下函数:

代码语言:javascript
复制
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

然后这样做:

代码语言:javascript
复制
results = pd.json_normalize(data)
flatten_nested_json_df(results)

它返回一个df,您可以从中选择您想要的任何内容:

代码语言:javascript
复制
 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...         

它还具有向您显示列名中所需内容的路径的优点,以便:

代码语言:javascript
复制
 data['Envelope']['Body']['GetCTProductsResponse']['GetCTProductsResult']['CTPRODUCT'][0]['CODE']             
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70436740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档