首页 > 解决方案 > 解析 JSON 以存储在 SQL 数据库中的最佳方法(SQL 存储过程/Python)

问题描述

我有一个过于复杂的 JSON 文件表,我正在尝试将其转换为表格格式以存储在 SQL 数据库中。我正在从 quickbooks 在线 API 中提取 JSON,至少可以说格式很混乱..(我们正在谈论 7x 嵌套的 JSON 的一些内容..

格式类似于下面的代码片段。目前,我正在使用一堆 OpenJSON 的 + Cross 应用程序来挖掘最里面的 ColData,然后向上工作,但看起来有些 ColData 被跳过了。

有没有更好的方法,使用 Python(因为我在将 JSON 发送到 SQL 数据库进行解析之前首先在 Python 中提取 JSON)或 SQL 将其转换为表格格式,除了手动尝试将 OpenJSON 与 Cross 应用一起使用?

目标是将所有 ColData 放入 SQL 表中......

谢谢!

{
  "Header": {
    "ReportName": "BalanceSheet", 
    "Option": [
      {
        "Name": "AccountingStandard", 
        "Value": "GAAP"
      }, 
      {
        "Name": "NoReportData", 
        "Value": "false"
      }
    ], 
    "DateMacro": "this calendar year-to-date", 
    "ReportBasis": "Accrual", 
    "StartPeriod": "2016-01-01", 
    "Currency": "USD", 
    "EndPeriod": "2016-10-31", 
    "Time": "2016-10-31T09:42:21-07:00", 
    "SummarizeColumnsBy": "Total"
  }, 
  "Rows": {
    "Row": [
      {
        "Header": {
          "ColData": [
            {
              "value": "ASSETS"
            }, 
            {
              "value": ""
            }
          ]
        }, 
        "Rows": {
          "Row": [
            {
              "Header": {
                "ColData": [
                  {
                    "value": "Current Assets"
                  }, 
                  {
                    "value": ""
                  }
                ]
              }, 
              "Rows": {
                "Row": [
                  {
                    "Header": {
                      "ColData": [
                        {
                          "value": "Bank Accounts"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "ColData": [
                            {
                              "id": "35", 
                              "value": "Checking"
                            }, 
                            {
                              "value": "1350.55"
                            }
                          ], 
                          "type": "Data"
                        }, 
                        {
                          "ColData": [
                            {
                              "id": "36", 
                              "value": "Savings"
                            }, 
                            {
                              "value": "800.00"
                            }
                          ], 
                          "type": "Data"
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "group": "BankAccounts", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Bank Accounts"
                        }, 
                        {
                          "value": "2150.55"
                        }
                      ]
                    }
                  }, 
                  {
                    "Header": {
                      "ColData": [
                        {
                          "value": "Accounts Receivable"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "ColData": [
                            {
                              "id": "84", 
                              "value": "Accounts Receivable (A/R)"
                            }, 
                            {
                              "value": "6383.12"
                            }
                          ], 
                          "type": "Data"
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "group": "AR", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Accounts Receivable"
                        }, 
                        {
                          "value": "6383.12"
                        }
                      ]
                    }
                  }, 
                  {
                    "Header": {
                      "ColData": [
                        {
                          "value": "Other current assets"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "ColData": [
                            {
                              "id": "81", 
                              "value": "Inventory Asset"
                            }, 
                            {
                              "value": "596.25"
                            }
                          ], 
                          "type": "Data"
                        }, 
                        {
                          "ColData": [
                            {
                              "id": "4", 
                              "value": "Undeposited Funds"
                            }, 
                            {
                              "value": "2117.52"
                            }
                          ], 
                          "type": "Data"
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "group": "OtherCurrentAssets", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Other current assets"
                        }, 
                        {
                          "value": "2713.77"
                        }
                      ]
                    }
                  }
                ]
              }, 
              "type": "Section", 
              "group": "CurrentAssets", 
              "Summary": {
                "ColData": [
                  {
                    "value": "Total Current Assets"
                  }, 
                  {
                    "value": "11247.44"
                  }
                ]
              }
            }, 
            {
              "Header": {
                "ColData": [
                  {
                    "value": "Fixed Assets"
                  }, 
                  {
                    "value": ""
                  }
                ]
              }, 
              "Rows": {
                "Row": [
                  {
                    "Header": {
                      "ColData": [
                        {
                          "id": "37", 
                          "value": "Truck"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "ColData": [
                            {
                              "id": "38", 
                              "value": "Original Cost"
                            }, 
                            {
                              "value": "13495.00"
                            }
                          ], 
                          "type": "Data"
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Truck"
                        }, 
                        {
                          "value": "13495.00"
                        }
                      ]
                    }
                  }
                ]
              }, 
              "type": "Section", 
              "group": "FixedAssets", 
              "Summary": {
                "ColData": [
                  {
                    "value": "Total Fixed Assets"
                  }, 
                  {
                    "value": "13495.00"
                  }
                ]
              }
            }
          ]
        }, 
        "type": "Section", 
        "group": "TotalAssets", 
        "Summary": {
          "ColData": [
            {
              "value": "TOTAL ASSETS"
            }, 
            {
              "value": "24742.44"
            }
          ]
        }
      }, 
      {
        "Header": {
          "ColData": [
            {
              "value": "LIABILITIES AND EQUITY"
            }, 
            {
              "value": ""
            }
          ]
        }, 
        "Rows": {
          "Row": [
            {
              "Header": {
                "ColData": [
                  {
                    "value": "Liabilities"
                  }, 
                  {
                    "value": ""
                  }
                ]
              }, 
              "Rows": {
                "Row": [
                  {
                    "Header": {
                      "ColData": [
                        {
                          "value": "Current Liabilities"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "Header": {
                            "ColData": [
                              {
                                "value": "Accounts Payable"
                              }, 
                              {
                                "value": ""
                              }
                            ]
                          }, 
                          "Rows": {
                            "Row": [
                              {
                                "ColData": [
                                  {
                                    "id": "33", 
                                    "value": "Accounts Payable (A/P)"
                                  }, 
                                  {
                                    "value": "1984.17"
                                  }
                                ], 
                                "type": "Data"
                              }
                            ]
                          }, 
                          "type": "Section", 
                          "group": "AP", 
                          "Summary": {
                            "ColData": [
                              {
                                "value": "Total Accounts Payable"
                              }, 
                              {
                                "value": "1984.17"
                              }
                            ]
                          }
                        }, 
                        {
                          "Header": {
                            "ColData": [
                              {
                                "value": "Credit Cards"
                              }, 
                              {
                                "value": ""
                              }
                            ]
                          }, 
                          "Rows": {
                            "Row": [
                              {
                                "ColData": [
                                  {
                                    "id": "41", 
                                    "value": "Mastercard"
                                  }, 
                                  {
                                    "value": "157.72"
                                  }
                                ], 
                                "type": "Data"
                              }
                            ]
                          }, 
                          "type": "Section", 
                          "group": "CreditCards", 
                          "Summary": {
                            "ColData": [
                              {
                                "value": "Total Credit Cards"
                              }, 
                              {
                                "value": "157.72"
                              }
                            ]
                          }
                        }, 
                        {
                          "Header": {
                            "ColData": [
                              {
                                "value": "Other Current Liabilities"
                              }, 
                              {
                                "value": ""
                              }
                            ]
                          }, 
                          "Rows": {
                            "Row": [
                              {
                                "ColData": [
                                  {
                                    "id": "89", 
                                    "value": "Arizona Dept. of Revenue Payable"
                                  }, 
                                  {
                                    "value": "4.55"
                                  }
                                ], 
                                "type": "Data"
                              }, 
                              {
                                "ColData": [
                                  {
                                    "id": "90", 
                                    "value": "Board of Equalization Payable"
                                  }, 
                                  {
                                    "value": "401.98"
                                  }
                                ], 
                                "type": "Data"
                              }, 
                              {
                                "ColData": [
                                  {
                                    "id": "43", 
                                    "value": "Loan Payable"
                                  }, 
                                  {
                                    "value": "4000.00"
                                  }
                                ], 
                                "type": "Data"
                              }
                            ]
                          }, 
                          "type": "Section", 
                          "group": "OtherCurrentLiabilities", 
                          "Summary": {
                            "ColData": [
                              {
                                "value": "Total Other Current Liabilities"
                              }, 
                              {
                                "value": "4406.53"
                              }
                            ]
                          }
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "group": "CurrentLiabilities", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Current Liabilities"
                        }, 
                        {
                          "value": "6548.42"
                        }
                      ]
                    }
                  }, 
                  {
                    "Header": {
                      "ColData": [
                        {
                          "value": "Long-Term Liabilities"
                        }, 
                        {
                          "value": ""
                        }
                      ]
                    }, 
                    "Rows": {
                      "Row": [
                        {
                          "ColData": [
                            {
                              "id": "44", 
                              "value": "Notes Payable"
                            }, 
                            {
                              "value": "25000.00"
                            }
                          ], 
                          "type": "Data"
                        }
                      ]
                    }, 
                    "type": "Section", 
                    "group": "LongTermLiabilities", 
                    "Summary": {
                      "ColData": [
                        {
                          "value": "Total Long-Term Liabilities"
                        }, 
                        {
                          "value": "25000.00"
                        }
                      ]
                    }
                  }
                ]
              }, 
              "type": "Section", 
              "group": "Liabilities", 
              "Summary": {
                "ColData": [
                  {
                    "value": "Total Liabilities"
                  }, 
                  {
                    "value": "31548.42"
                  }
                ]
              }
            }, 
            {
              "Header": {
                "ColData": [
                  {
                    "value": "Equity"
                  }, 
                  {
                    "value": ""
                  }
                ]
              }, 
              "Rows": {
                "Row": [
                  {
                    "ColData": [
                      {
                        "id": "34", 
                        "value": "Opening Balance Equity"
                      }, 
                      {
                        "value": "-9337.50"
                      }
                    ], 
                    "type": "Data"
                  }, 
                  {
                    "ColData": [
                      {
                        "id": "2", 
                        "value": "Retained Earnings"
                      }, 
                      {
                        "value": "91.25"
                      }
                    ], 
                    "type": "Data"
                  }, 
                  {
                    "ColData": [
                      {
                        "value": "Net Income"
                      }, 
                      {
                        "value": "2440.27"
                      }
                    ], 
                    "type": "Data", 
                    "group": "NetIncome"
                  }
                ]
              }, 
              "type": "Section", 
              "group": "Equity", 
              "Summary": {
                "ColData": [
                  {
                    "value": "Total Equity"
                  }, 
                  {
                    "value": "-6805.98"
                  }
                ]
              }
            }
          ]
        }, 
        "type": "Section", 
        "group": "TotalLiabilitiesAndEquity", 
        "Summary": {
          "ColData": [
            {
              "value": "TOTAL LIABILITIES AND EQUITY"
            }, 
            {
              "value": "24742.44"
            }
          ]
        }
      }
    ]
  }, 
  "Columns": {
    "Column": [
      {
        "ColType": "Account", 
        "ColTitle": "", 
        "MetaData": [
          {
            "Name": "ColKey", 
            "Value": "account"
          }
        ]
      }, 
      {
        "ColType": "Money", 
        "ColTitle": "Total", 
        "MetaData": [
          {
            "Name": "ColKey", 
            "Value": "total"
          }
        ]
      }
    ]
  }
}

这是我尝试获取 ColData 的内容(我可能会添加失败),我认为在 SQL 中这样做可能有点做作,但我不确定是否应该继续尝试这种方式,或者在 Python 中是否有更好的方法:

declare @json nvarchar(max)

SELECT @json = json FROM QboApiRawJSONData WHERE ID = 2

 

--Outer layer of JSON breaks into 3 parts - header, columns, rows
SELECT * FROM OPENJSON(@json)
WITH
(
    Rows nvarchar(max) AS JSON
)  as MainLayer
CROSS APPLY OPENJSON (MainLayer.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as SecondaryLayer
CROSS APPLY OPENJSON (SecondaryLayer.Row) 
WITH
(
Rows nvarchar(max) AS JSON
) As ThirdLayer
CROSS APPLY OPENJSON (ThirdLayer.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as FourthLayer
CROSS APPLY OPENJSON (FourthLayer.Row) 
WITH
(
Rows nvarchar(max) AS JSON
) as FifthLayer
CROSS APPLY OPENJSON (FifthLayer.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as SixthLayer
CROSS APPLY OPENJSON (SixthLayer.Row) 
WITH
(

Rows nvarchar(max) AS JSON
) as SeventhLayer
CROSS APPLY OPENJSON (SeventhLayer.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as EighthLayer
CROSS APPLY OPENJSON (EighthLayer.Row) 
WITH
(
Rows nvarchar(max) AS JSON
) as LayerNine

---Things get funky here
CROSS APPLY OPENJSON (LayerNine.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as LayerTen
CROSS APPLY OPENJSON (LayerTen.Row) 
WITH
(
Rows nvarchar(max) AS JSON
) as LayerEleven
CROSS APPLY OPENJSON (LayerEleven.Rows) 
WITH
(
Row nvarchar(max) AS JSON
) as LayerTwelve

--21 items in last col

标签: pythonsqljsonsql-serverquickbooks-online

解决方案


这里有一个 JSON 存储方法:https ://docs.microsoft.com/en-us/sql/relational-databases/json/store-json-documents-in-sql-tables?view=sql-server-ver15 。虽然这里会相当复杂,但我建议将 JSON 数据存储为 Logs 表,然后按照上面的教程查看是否能解决您的问题。


推荐阅读