#python #json #amazon-web-services #aws-lambda
#python #json #amazon-веб-сервисы #aws-lambda
Вопрос:
У меня есть данные JSON, поступающие на S3 в формате:
{n "data": {n "event_type": "message.received",n "id": "819",n "occurred_at": "2020-10",n "payload": {n "cc": [],n "completed_at": null,n "cost": null,n "direction": "inbound",n "encoding": "GSM-7",n "errors": [],n "from": {n "carrier": "Verizon",n "line_type": "Wireless",n "phone_number": " 111111111"n },n "id": "e8e0d1e3-dce3-",n "media": [],n "messaging_profile_id": "400176",n "organization_id": "717d556f-ba4f-",n "parts": 1,n "received_at": "2020-1",n "record_type": "message",n "sent_at": null,n "tags": [],n "text": "Hi ",n "to": [n {n "carrier": "carr",n "line_type": "Wireless",n "phone_number": " 111111111",n}n}"
Я хочу, чтобы он был преобразован следующим образом:
{
"data": {
"event_type": "message.received",
"id": "76a60230",
"occurred_at": "2020-12-1",
"payload": {
"cc": [],
"completed_at": null,
"cost": null,
"direction": "inbound",
"encoding": "GSM-7",
"errors": [],
"from": {
"carrier": "Verizon",
"line_type": "Wireless",
"phone_number": " 1111111111"
},
"id": "06c9c765",
"media": [],
"messaging_profile_id": "40017",
"organization_id": "717d5",
"parts": 1,
"received_at": "2020-1",
"record_type": "message",
"sent_at": null,
"tags": [],
"text": "Hi",
"to": [
{
"carrier": "abc",
"line_type": "Wireless",
"phone_number": " 1111111111",
"status": "delivered"
}
],
"type": "SMS",
"valid_until": null,
"failover_url": null,
"url": "https://639hpj"
},
"record_type": "event"
},
"meta": {
"attempt": 1,
"delivered_to": "https://639hpj"
}
}
Первые данные JSON, которые я сохранил, были в строках, а не в формате Struct . Я не сохранил фактические данные JSON, но они были в том же формате (но действительны). Я хотел бы запустить лямбда-функцию, в которой данные JSON не содержат n
пробелов и пробелов.
Приведенные выше 2 JSON-данные не совпадают, но я буду получать данные JSON первого типа, и я хотел бы преобразовать их во второй тип, который свободен от пробелов и n
.
Комментарии:
1. Если вы сделаете
print(my_variable)
это вместо вводаmy_variable
в>>>
командной строке, он будет отображаться так, как вы хотите. Разница в том, что вы смотрите на переменную в представлении Python по умолчанию, которое является исходным кодом, необходимым для повторного создания значения.
Ответ №1:
Вы поняли, что пробелы и print
новые строки используются для форматирования?
Давайте вызовем t
ваш первый json (я исправил это, добавив недостающие скобки в конце):
t = '''{n "data": {n "event_type": "message.received",n "id": "819",n "occurred_at": "2020-10",n "payload": {n "cc": [],n "completed_at": null,n "cost": null,n "direction": "inbound",n "encoding": "GSM-7",n "errors": [],n "from": {n "carrier": "Verizon",n "line_type": "Wireless",n "phone_number": " 111111111"n },n "id": "e8e0d1e3-dce3-",n "media": [],n "messaging_profile_id": "400176",n "organization_id": "717d556f-ba4f-",n "parts": 1,n "received_at": "2020-1",n "record_type": "message",n "sent_at": null,n "tags": [],n "text": "Hi ",n "to": [n {n "carrier": "carr",n "line_type": "Wireless",n "phone_number": " 111111111"n}n]n}}}'''
Он печатается как:
>>> print(t)
{
"data": {
"event_type": "message.received",
"id": "819",
"occurred_at": "2020-10",
"payload": {
"cc": [],
"completed_at": null,
"cost": null,
"direction": "inbound",
"encoding": "GSM-7",
"errors": [],
...
Чтобы получить ожидаемое представление, вы должны:
- загрузите его в объект Python:
js = json.loads(t)
- сбросьте его обратно в строку с 2 в качестве отступа:
t2 = json.dumps(js)
t2
на самом деле выглядит так'{n "data": {n "event_type": "message.received",n "id": "819",n "occurred_at": "2020-10",n "payload": {n "cc": [],n "completed_at": null,n "cost": null,n ...
- распечатайте его:
>>> print(t2) { "data": { "event_type": "message.received", "id": "819", "occurred_at": "2020-10", "payload": { "cc": [], "completed_at": null, "cost": null, "direction": "inbound", "encoding": "GSM-7", "errors": [], "from": { "carrier": "Verizon", "line_type": "Wireless", ...
Одна строка может быть:
print(json.dumps(json.loads(t), indent=2))
Ответ №2:
Обычно это делается через literal_eval, который возьмет вашу строку и проанализирует ее в словаре python:
import ast
# replace with full string of yours
s='{n "data": {n "event_type": "message.received",n "id": "819"n}n}'
result = ast.literal_eval(s)
print(type(result), result)
Ответ №3:
Сначала вы можете загрузить его как словарь Python с:
import json
myDict = json.loads(jsonString)
А затем преобразуйте его обратно в свернутую строку JSON с отступом:
minimizedJSON = json.dumps(myDict)
indentedJSON = json.dumps(myDict, indent = <# of spaces>)