У меня есть 2 объекта json в python, для каждого из разделов во 2-м объекте мне нужно добавить и вложить их в первый. Как бы я этого достиг?

#python #json #dictionary #nested

#python #json #словарь #вложенный

Вопрос:

Прошу прощения, если это не имеет смысла, но я объяснил это как можно лучше.

У меня есть 2 объекта json в python (orderdetails, orderlines) с общим полем (order_id)

Для каждого из {данных в скобках с тем же order_id, что и orderdetails} в orderlines мне нужно добавить и вложить их в детали заказа, чтобы конечный результат выглядел так: Конечный результат

orderdetails — это большие данные, а orderlines — это небольшие данные.

Мои данные извлекаются из SQL, а затем преобразуются впоследствии в dataframe, а затем в json.

Я рассмотрел несколько вопросов по этому поводу, но большинство из них на самом деле не относятся к тому, что я хочу сделать.

Вот приведенный ниже код, который у меня есть в настоящее время:

 from func.excelfunction import *
from datetime import datetime as dt
from datetime import timedelta
import requests
import csv
import os
import math
from sql_server.sql_server import *
import pandas as pd
import json

#variables 
dir_path = os.path.dirname(os.path.realpath(__file__))


df1 = run_sql_df('SET NOCOUNT ON; exec isawitfirstdb.dbo.usp_Torque_orderDetails')
df1 = df1.astype({"created_at":"str","order_number":"str","order_id":"int64","instructions":"str","dispatch_method":"str","email":"str","Contact":"str",
"name":"str","address_1":"str","address_2":"str","town":"str","county":"str","postcode":"str","country":"str","invoice_currency":"str",
"subtotal_price":"str","total_price":"str","invoice_name":"str","invoice_contact_phone":"str","invoice_address_1":"str","invoice_address_2":"str",
"invoice_town":"str","invoice_county":"str","invoice_postcode":"str","inovice_country":"str","Owner_id":"str","Merge_status":"str","Merge_action":"str","Record_type":"str"})

df2 = run_sql_df('SET NOCOUNT ON; exec isawitfirstdb.dbo.usp_Torque_orderLineDetails')
df2 = df2.astype({"sku_id":"str","order_id":"int64","qty_ordered":"int64","user_def_type_1":"str","user_def_type_2":"str","user_def_num_1":"str","line_value":"int64","config_id":"str","Merge_status":"str","Merge_action":"str","Record_type":"str"})

#convert to dataframe
orders = pd.DataFrame(df1)
orderlines = pd.DataFrame(df2)

#convert to dataframe to json
orders = orders.to_json(orient="records")
orderlines = orderlines.to_json(orient="records")

# JSON
df = orders   orderlines

print(df)
  

Ответ №1:

Используйте some_dict.update({'some_exclusive_key': some_object}) для добавления к dict

Ответ №2:

Я предполагаю, что для каждого order_id в orders существует только одна запись, но в orderlines может существовать несколько. Если это так, вы можете выполнить итерацию по списку заказов и для каждой записи добавить новое поле со списком, orderlines которые соответствуют этому order_id . Вы можете получить этот список с помощью filter()

 new_list = []
for rec in orders:
    order_id = rec.get('order_id')
    matching_orderlines = list(filter(lambda ol: ol['order_id'] == order_id, orderlines))
    new_list.append({*rec,'lines':matching_orderlines})
  

Я также предполагаю, что ключ order_id всегда существует. если нет, замените скобки на .get() . Я не тестировал приведенный выше код…