【问题标题】:What is the correct way to parse a json array with the use of json.loads?使用 json.loads 解析 json 数组的正确方法是什么?
【发布时间】:2021-04-08 22:08:28
【问题描述】:

我试图弄清楚如何从 JSON 文件中解析完整的数组。我设法用单个对象做到了,但我不知道为什么它不适用于完整的数组。

[
{"SequenceNumber": 20, "Offset": "4294967296", "EnqueuedTimeUtc": "4/8/2021 7:22:56 AM", "SystemProperties": {"x-opt-enqueued-time": {"long": 1617866576085}}, "Properties": {"Postman-Token": {"string": "21be7531-8f6b-422c-b676-#####"}}, "Body": {"bytes": "{\"id\":1,\"receiver\":\"77777777\",\"message\":{\"test\":\" test signal\",\"PrsId\":3,\"DriverId\":2,\"GUID\":\"1s3q1d-s546dq1-8e22e\",\"LineId\":2,\"SvcId\":2,\"Lat\":-456.546547,\"Lon\":-68.546547,\"TimeStamp\":\"2021-03-18T08:29:36.758Z\",\"Recorder\":\"dq65ds4qdezzer\",\"Env\":\"PRD\"},\"operator\":20404,\"sender\":\"MSISDN\",\"binary\":1,\"sent\":\"2021-03-29T08:29:36.758Z\"}"}},
{"SequenceNumber": 20, "Offset": "4294967296", "EnqueuedTimeUtc": "4/8/2021 7:22:56 AM", "SystemProperties": {"x-opt-enqueued-time": {"long": 1617866576085}}, "Properties": {"Postman-Token": {"string": "21be7531-8f6b-422c-b676-#####"}}, "Body": {"bytes": "{\"id\":1,\"receiver\":\"77777777\",\"message\":{\"test\":\" test signal\",\"PrsId\":3,\"DriverId\":2,\"GUID\":\"1s3q1d-s546dq1-8e22e\",\"LineId\":2,\"SvcId\":2,\"Lat\":-65634.546547,\"Lon\":-68.546547,\"TimeStamp\":\"2021-03-18T08:29:36.758Z\",\"Recorder\":\"dq65ds4qdezzer\",\"Env\":\"PRD\"},\"operator\":20404,\"sender\":\"MSISDN\",\"binary\":1,\"sent\":\"2021-03-29T08:29:36.758Z\"}"}},
{"SequenceNumber": 20, "Offset": "4294967296", "EnqueuedTimeUtc": "4/8/2021 7:22:56 AM", "SystemProperties": {"x-opt-enqueued-time": {"long": 1617866576085}}, "Properties": {"Postman-Token": {"string": "21be7531-8f6b-422c-b676-#####"}}, "Body": {"bytes": "{\"id\":1,\"receiver\":\"77777777\",\"message\":{\"test\":\" test signal\",\"PrsId\":3,\"DriverId\":2,\"GUID\":\"1s3q1d-s546dq1-8e22e\",\"LineId\":2,\"SvcId\":2,\"Lat\":-78946.546547,\"Lon\":-68.546547,\"TimeStamp\":\"2021-03-18T08:29:36.758Z\",\"Recorder\":\"dq65ds4qdezzer\",\"Env\":\"PRD\"},\"operator\":20404,\"sender\":\"MSISDN\",\"binary\":1,\"sent\":\"2021-03-29T08:29:36.758Z\"}"}}
]

我通过在 Python 中执行以下操作了解了如何使用单个对象执行此操作:

response['Body'] = json.loads(response['Body']['bytes'])

我做错了什么?即使是数组也不应该是一样的吗?

希望的结果是这样的

[
  {"id":1,"receiver":"77777777","message":{"test":" test signal","VehId":3,"DriverId":2,"GUID":"1s3q1d-s546dq1-8e22e","LineId":2,"SvcId":2,"Lat":-64.546547,"Lon":-68.546547,"TimeStamp":"2021-03-18T08:29:36.758Z","Recorder":"dq65ds4qdezzer","Env":"PRD"},"operator":20404,"sender":"MSISDN","binary":1,"sent":"2021-03-29T08:29:36.758Z"},
  {"id":1,"receiver":"77777777","message":{"test":" test signal","VehId":3,"DriverId":2,"GUID":"1s3q1d-s546dq1-8e22e","LineId":2,"SvcId":2,"Lat":-64.546547,"Lon":-68.546547,"TimeStamp":"2021-03-18T08:29:36.758Z","Recorder":"dq65ds4qdezzer","Env":"PRD"},"operator":20404,"sender":"MSISDN","binary":1,"sent":"2021-03-29T08:29:36.758Z"},
  {"id":1,"receiver":"77777777","message":{"test":" test signal","VehId":3,"DriverId":2,"GUID":"1s3q1d-s546dq1-8e22e","LineId":2,"SvcId":2,"Lat":-64.546547,"Lon":-68.546547,"TimeStamp":"2021-03-18T08:29:36.758Z","Recorder":"dq65ds4qdezzer","Env":"PRD"},"operator":20404,"sender":"MSISDN","binary":1,"sent":"2021-03-29T08:29:36.758Z"}
]

编辑:当我尝试将它与数组一起使用时出现以下错误: 我试图解析的文件如下: (结果:失败异常:TypeError:列表索引必须是整数或切片,而不是str)

【问题讨论】:

  • 你为什么认为你做错了什么?
  • 因为我在尝试使用数组时收到消息失败(结果:失败异常:TypeError:列表索引必须是整数或切片,而不是 str)。
  • 应该把这个问题放在问题中,哈哈
  • @BuddyBobIII 是的,很抱歉,我认为这将是某种“错误使用 JSON.loads()”,错误消息并不重要。

标签: python arrays json parsing


【解决方案1】:

response 是一个 list,因此您正在用字符串索引一个列表。

response['Body'] = [json.loads(item['Body']['bytes']) for item in response] 应该可以工作。

【讨论】:

  • 出于好奇,如果我返回一个 func.HttpResponse 是不是同样的情况? ``` return func.HttpResponse(json.loads(jsonStr['Body']['bytes']) for jsonStr in func.HttpResponse,status_code=200) ``` 其中 jsonStr 是一个用 JSON 对象数组填充的文档.我应该这样做吗?还是我做错了?
  • 假设您在此处使用 Azure Functions - HttpResponse 的主体应该是 JSON 字符串,因此应该使用类似 func.HttpResponse(json.dumps([ json.loads(item['Body']['bytes']) for item in response ]), mimetype="application/json", status_code=200) 的内容。您需要将响应的 MIME 类型定义为 JSON。见相关:stackoverflow.com/a/59719773/8704792
  • 哦,好的,感谢您让我知道“MIME 类型”,我是否应该将“响应”替换为“jsonStr”,它是包含 JSON 数组的文件?我通过这样做来定义它: with open('json_file.json','rb') as file: jsonStr = file.read()
【解决方案2】:

我想你正在寻找这个?


for dict1 in x:
   print(dict1["Body"]["bytes"])

您的错误是,您没有遍历列表中的字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多