функция python для преобразования данных в JSON

Могу ли я проверить, как мы преобразуем приведенное ниже в словарь?

код.py

message = event['Records'][0]['Sns']['Message']
print(message) 
# this gives the below and the type is <class 'str'>

 {
   "created_at":"Sat Jun 26 12:25:21 +0000 2021",
   "id":1408763311479345152,
   "text":"@test I\'m planning to buy the car today \ud83d\udd25\n\n",
   "language":"en",
   "author_details":{
      "author_id":1384883875822907397,
      "author_name":"\u1d04\u0280\u028f\u1d18\u1d1b\u1d0f\u1d04\u1d1c\u0299 x NFTs \ud83d\udc8e",
      "author_username":"cryptocurrency_x009",
      "author_profile_url":"https://xxxx.com",
      "author_created_at":"Wed Apr 21 14:57:11 +0000 2021"
   },
   "id_displayed":"1",
   "counter_emoji":{
      
   }
}

Мне нужно было бы добавить дополнительное поле с именем "status" : 1, чтобы оно выглядело так:

{
   "created_at":"Sat Jun 26 12:25:21 +0000 2021",
   "id":1408763311479345152,
   "text":"@test I\'m planning to buy the car today \ud83d\udd25\n\n",
   "language":"en",
   "author_details":{
      "author_id":1384883875822907397,
      "author_name":"\u1d04\u0280\u028f\u1d18\u1d1b\u1d0f\u1d04\u1d1c\u0299 x NFTs \ud83d\udc8e",
      "author_username":"cryptocurrency_x009",
      "author_profile_url":"https://xxxx.com",
      "author_created_at":"Wed Apr 21 14:57:11 +0000 2021"
   },
   "id_displayed":"1",
   "counter_emoji":{
      
   },
   "status": 1
}

Хотел узнать, как лучше всего это сделать?

Обновление: мне удалось это сделать по какой-то причине.

Я использовал ast.literal_eval(data), как показано ниже.

D2= ast.literal_eval(message)
D2["status"] =1
print(D2)
#This gives the below
    {
   "created_at":"Sat Jun 26 12:25:21 +0000 2021",
   "id":1408763311479345152,
   "text":"@test I\'m planning to buy the car today \ud83d\udd25\n\n",
   "language":"en",
   "author_details":{
      "author_id":1384883875822907397,
      "author_name":"\u1d04\u0280\u028f\u1d18\u1d1b\u1d0f\u1d04\u1d1c\u0299 x NFTs \ud83d\udc8e",
      "author_username":"cryptocurrency_x009",
      "author_profile_url":"https://xxxx.com",
      "author_created_at":"Wed Apr 21 14:57:11 +0000 2021"
   },
   "id_displayed":"1",
   "counter_emoji":{
      
   },
   "status": 1
}

Есть ли лучший способ сделать это? Я не уверен, поэтому хотел проверить...


person Adam    schedule 26.06.2021    source источник
comment
Это уже является словарем. Если вы не имеете в виду, что у вас есть строка, которая выглядит так, в этом случае ответом будет json.loads. Не прикасайтесь к модулю ast, если вы действительно не разбираетесь в Python. Как эти данные попадают в вашу программу?   -  person Silvio Mayolo    schedule 26.06.2021
comment
Я также пытался использовать json.loads(data), но это вызвало ошибку Какая ошибка?   -  person enzo    schedule 26.06.2021
comment
Содержимое значения text кажется недействительным - как было создано это json-подобное?   -  person snakecharmerb    schedule 26.06.2021
comment
Это было создано с использованием простой службы уведомлений в AWS (SNS) и отправки этого сообщения в лямбду. сообщение, размещенное в SNS, представляет собой объект JSON, который преобразуется в строку JSON (с использованием JSON.dumps). данные передаются из твиттера.   -  person Adam    schedule 26.06.2021


Ответы (2)


Могу ли я проверить, как мы преобразуем приведенное ниже в словарь?

Насколько я могу судить, data = { } присваивает словарь с содержимым переменной data.

Мне нужно было бы добавить дополнительное поле с именем "status" : 1, чтобы оно выглядело так

Простое обновление должно помочь.

data.update({"status": 1})
person Seth    schedule 26.06.2021

Я обнаружил две проблемы при попытке десериализовать строку как JSON.

  • неверный переход I\\'m
  • неэкранированные новые строки

Они могут работать с

data = data.replace("\\'", "'")
data = re.sub('\n\n"', '\\\\n\\\\n"', data, re.MULTILINE)
d = json.loads(data)

В данных также есть суррогатные пары, которые могут вызвать проблемы в дальнейшем. Их можно исправить, выполнив

data = data.encode('utf-16', 'surrogatepass').decode('utf-16')

перед вызовом json.loads.

После десериализации данных в dict вы можете вставить новую пару ключ/значение.

d['status'] = 1
person snakecharmerb    schedule 26.06.2021
comment
Привет, @snakecharmerb, спасибо за это! на самом деле я могу проверить, что лучше? Делать это или использовать data= ast.literal_eval(data)? - person Adam; 27.06.2021
comment
Для меня использование ast.literal_eval приводит к UnicodeEncodeError из-за суррогатных пар (смайликов в конце text и author_name), поэтому я предпочитаю свой ответ. Кажется, вы не получаете ошибку (возможно, вы выполняете код на компьютере с Windows, который изначально использует UTF-16?), поэтому, если ast.literal_eval работает, то это ничуть не хуже. В конце концов, оба подхода являются обходными путями, и необходимо исправить любой восходящий код, который генерирует недопустимый JSON. - person snakecharmerb; 27.06.2021