Как удалить пробелы и n в файле JSON в Python

#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": [],
...
 

Чтобы получить ожидаемое представление, вы должны:

  1. загрузите его в объект Python: js = json.loads(t)
  2. сбросьте его обратно в строку с 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 ...

  3. распечатайте его:
      >>> 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>)