是否有办法以动态方式读取json数据?



我有不同类型的JSON文件。例如,1文件有这样的JSON,

{
  "first":true,
  "last":true,
  "pageSize":10,
  "page":0,
  "totalPages":1,
  "totalItems":10,
  "items":[
     {
        "chargerId":"EX-1193-1A13-1-2149-00024",
        "chargerName":"Lite-on IC80",
        "imsi":null,
        "location":{
           "type":"Point",
           "coordinates":[
              -84.62403006,
              39.13444449
           ]
        },
"MD_BATCH_ID": "253",
"MD_INGESTION_DATE_TIME": "2022-12-21 14:37:07.223291",
"MD_RECORD_NUMBER": 2
     },
     {
        "chargerId":"0df6d6930f494a2e86f5aa4d5fdf78fc",
        "chargerName":"Solution Lab Rhombus 60kW",
        "imsi":null,
        "location":{
           "type":"Point",
           "coordinates":[
              -84.62248500,
              39.13479400
           ]
        },
"MD_BATCH_ID": "253",
"MD_INGESTION_DATE_TIME": "2022-12-21 14:37:07.223291",
"MD_RECORD_NUMBER": 2
}
]
}
  1. 第二个JSON文件是这样的

[
{
"assetId": "2ca0021f841adc4b01841ae581730000",
"start": "2022-09-23T15:04:34.229Z",
"end": "2050-01-01T00:00:00.000Z",
"year": 2022,
"oem": "FORD",
"model": "F-150",
"MD_BATCH_ID": "253",
"MD_INGESTION_DATE_TIME": "2022-12-21 14:37:07.223291",
"MD_RECORD_NUMBER": 2
},
{
"assetId": "2ca0075582044cdc0182371cb4da0004",
"start": "2022-01-04T17:24:39.809Z",
"end": "2050-01-01T00:00:00.000Z",
"year": 2022,
"oem": "KIA",
"model": "Niro",
"MD_BATCH_ID": "253",
"MD_INGESTION_DATE_TIME": "2022-12-21 14:37:07.223291",
"MD_RECORD_NUMBER": 2
}
]

现在我必须在两个文件中添加一些键值对,但我不知道我会收到哪种类型的JSON,因为在第一个JSON对象中,数据在内而在第二个JSON中,数据是直接可用的,不需要任何键。

我想让它是动态的,这样我就可以在对象中附加键和值,而不管我在Python中接收到什么文件。如果您在上面看到,我在每个元素中添加了3个键MD_BATCH_ID,MD_INGESTION_DATE_TIME,MD_RECORD_NUMBER。我必须将这3个键添加到JSON对象中的每个元素。我怎样才能使它动态?请帮助。

目前,我的代码看起来像这样,但它不会对每个文件工作,这只会对那些有项目作为键的文件工作-

def process_json_file(json_string,s3_client,bucket_name,key):
global index_count
index_count = 1 
print('Inside Json Reader')
json_content = json.loads(json_string)
cur_datetime = datetime.now()
print(json_content['items'])
for i in json_content['items']:
i["MD_BATCH_ID"] = '253'
i["MD_INGESTION_DATE_TIME"] = cur_datetime
i["MD_RECORD_NUMBER"] = index_count
index_count = index_count +1 
s3_client.put_object(Bucket=bucket_name, Key=key, Body=json.dumps(json_content,indent=4,default=str).encode())

首先,检查json_content是否包含items数组。

json_content.__contains__('items')

如果没有,可以这样添加:

json_content.append({ 'items' : [{'Column1':'Data for your column'}]})

神奇的方法__contains__可以帮助您找到丢失的内容,而您可以添加(通过追加),处理所有数据。

希望这就是你想要的。

改善答:

我已经创建了您的代码和两个文件:Test0。. json和Test1. json。
from datetime import datetime
import json
def process_json_file(json_content,s3_client,bucket_name,key):
global index_count
index_count = 1 
print('Inside Json Reader')
cur_datetime = datetime.now()
for ix, value in enumerate(json_content):
print (value)
if(type(value) == type({})): #If type is a dictionary, you have another object inside.
#Create a recursive call if you want several levels
for jx, val in enumerate(value):
print(val)


if(json_content.__contains__('items')):
for i in json_content['items']:
i["MD_BATCH_ID"] = '253'
i["MD_INGESTION_DATE_TIME"] = cur_datetime
i["MD_RECORD_NUMBER"] = index_count
index_count = index_count +1 
#s3_client.put_object(Bucket=bucket_name, Key=key, Body=json.dumps(json_content,indent=4,default=str).encode())
with open("Test0.json") as json_file:
defaultValues = json.load(json_file)
process_json_file(defaultValues, None,None,None)
with open("Test1.json") as json_file:
defaultValues = json.load(json_file)
process_json_file(defaultValues, None,None,None)

当您导入文件并将其转换为Json时,您将获得几个对象。所以可以列举它们,在里面旅行,改变/添加东西。检查是否可以枚举对象:如何检查json对象是否为array

然后你就可以随意比较和添加东西了。只要记住比较并找到您需要的数据将被插入的出汗点。

如果这是你想要的,请记住标记为答案:)

最新更新