Jump to content

Recommended Posts

Введение.

Цель данного урока - объяснить, как разбирать (парсить) JSON-строку с помощью MicroPython, запущенного на ESP32. В предыдущем уроке мы подробно рассказали про установку MicroPython на ESP32  и подключение к его консоли.

Чтобы разобрать JSON-строку, воспользуемся библиотекой uJSON для MicroPython. Вся документация к ней лежит на гитхабе.

Так как будем работать в командной строке, нужно перевести всё содержимое JSON в одну строку, например, при помощи этого сайта.  Получившуюся строку можно просто скопировать и вставить в терминальное окно PuTTy.

Код.

Подключившись к консоли Python, можно начинать программировать. Первое, что нам надо сделать - это загрузить библиотеку uJSON. Вводим в консоль команду

import ujson

и нажимаем Enter.

В результате мы должны получить объект типа ujson, дающий доступ к методу с именем "loads". Этот метод получает в качестве аргумента JSON-строку, а возвращает объект, соответствующий распознанному JSON.

Начнём с простой структуры JSON:

{
"name":"John"
},

После сжатия в одну линию получим JSON строку вида:

{"name":"John"},

Передадим эту строку в качестве аргумента методу loads. Обратите внимание, слева и справа от строки стоят тройные кавычки “””.  Это сделано для верного распознавания кавычек внутри JSON-структуры. Распознанный объект сохраним в переменной parsed.

parsed = ujson.loads("""{"name":"John"}""")

Проверим, что содержание JSON записано в переменную parsed правильно, для чего напечатаем его, а также имя типа, к которому принадлежит parsed, используя функцию type().

print(parsed)
print(type(parsed))

Когда запустим весь код, приведённый выше, мы должны получить в результате то же, что показано на Рисунке 1. Обратите внимание, наш объект с разобранным содержимым JSON относится к типу словарь в Python (ссылка на английском здесь), который идеально подходит для доступа типа ключ-значение.

5bcb17a5e80a0_Figure1ParsingtheJSONstring..png.a3c4f307bb692913c0df66e5cf13bd88.png

Рисунок 1. Разбор строки JSON

Теперь мы можем получить значение по ключу “name”, и оно должно быть “John”. Чтобы получить из словаря значение по ключу, отправим команду: 

print(parsed["name"])

Такое обращение очень похоже на доступ к элементу массива по индексу, но только вместо численного индекса здесь выступает ключ в формате строки.

Должен получиться результат такой же, как и на Рис. 2, где значение “John”выведено в консоль.

5bcb1852755f0_Figure2Accessingtheparsedvaluesofthedictionaryobject..png.ad62e28c934666b64f29ecf4738888e1.png

Рисунок 2.  Доступ к разобранным значениям объекта типа словарь.

Теперь разберём более сложную структуру. Она может представлять собой, например, сообщение, отправленное IoT устройством:

{
"device":"temperature",
"id":543,
"values":[1,2,3]
}

После сжатия получим следующую строку:

{"device":"temperature","id":543,"values":[1,2,3]}

Теперь разберём её и напечатаем все ключи, имеющиеся в нашей JSON-структуре. Также напечатаем тип значений, получаемых по ключу, чтобы понять, как они распознались.

parsed = ujson.loads("""{"device":"temperature","id":543,"values":[1,2,3]}""")
print(parsed["device"])
print(parsed["id"])
print(parsed["values"])

print(type(parsed["values"]))

Результат работы кода показан на Рис. 3. Как видно, все значения по каждому ключу напечатаны верно. Заметьте, что ключу "values" соответствует список, а не строки. Естественно, это намного удобнее, так как нам гораздо легче обрабатывать полученные численные значения, используя все функции, доступные для списков.

5bcb1c1ecdc82_Figure3ResultoftheJSONcontentparsed..png.b7ed034d3e148acc970061ae65b9ba9a.png

Рисунок 3. Результат разбора содержания JSON.

 

Важно: Этот пост - перевод статьи, написанной Nuno Santos из Лиссабона (Португалия), инженером в области электроники и компьютерной техники. Можно познакомиться с его оригинальными статьями здесь. Он написал ещё много полезных уроков и проектов про ESP32, ESP8266, и, если интересно, можно почитать его блог.

У DFRobot есть много других обучающих статей по ESP32 и готовых проектов на основе ESP32.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By DFRobot
      Введение.
      Цель данного урока - научиться запускать на ESP32 скрипты MicroPython, написанные на компьютере, используя программу ampy. Этот урок был опробован и на ESP8266, и на ESP32.
      Ampy - это утилита от Adafruit, и его исходники можно скачать отсюда. На Adafruit есть подробнейшая документация по этой утилите, и рекомендуем с ней ознакомиться. Однако, самым простым способом начать использовать ampy - это загрузить его через pip.
      В отличие от того, как мы поступали на предыдущих уроках, отправляя в консоль по одной команде, ampy позволит запустить скрипты на microPython из файла. На этом уроке мы по умолчанию считаем, что на вашем компьютере уже установлены Python и pip, а на плате с ESP32/ESP8266 установлен MicroPython.
      Процедура.
      Первым делом устанавливаем ampy. Для этого открываем командную строку и вводим следующую pip-команду:
      pip install adafruit-ampy Мы используем версию Python 2.7 на операционной системе Windows, и результат выполнения команды показан на Рис. 1. У вас может выводиться что-то другое в зависимости от ОС и версии Python.

      Рис.1 Установка ampy.
      Очень детальное руководство по установке ampy есть и на Adafruit.
      Ну и теперь запуск кода из скриптов станет очень простым. Для этого надо всего лишь создать файл с именем script.py в папке на Вашем компьютере и ввести код ниже. Естественно, название файла может быть любым другим. Также и расширение не обязательно должно быть *.py ( я пробовал с расширением *.txt, и всё прекрасно работало), но раз уж файл содержит скрипт, написанный на языке Python, то хорошим тоном будет использование именно расширения *.py. 
      Для примера в файле запишем строку:
      print("Hello from my script!") В командной строке переходим в ту папку, куда сохранили файл. Отправляем команду, изменив значения в квадратных скобках на подходящие:
      ampy --port [YourDevicePort] run [YourFileName] В нашем случае ESP8266 подключен к порту COM7, а ESP32 к порту COM5, и команды для проверки каждого из них показаны ниже, также с правильным именем файла:
      ampy --port COM5 run script.py ampy --port COM7 run script.py Если всё в порядке, вы получите примерно то же, что и на Рис. 2, где виден результат работы скрипта на ESP32 и ESP8266.

      Рис.2. Результат работы скрипта, запущенного на ESP8266 и на ESP32.
      Важно: в той версии утилиты ampy, которая установлена у меня, выполнение любого скрипта сразу после подключения контроллеров выдаёт ошибку подобную той, что показана на Рис. 3. Это случается как на ESP8266, так и на RSP32. Но после этой первой ошибки последующие запуски скриптов выполняются нормально. Я пока не нашёл причины этого, но поделюсь, если найду.

      Рис. 3.
      Пожалуйста, напишите в комментариях, наблюдается ли такая ошибка у вас.
       
      Важно: Этот пост - перевод статьи, написанной Nuno Santos из Лиссабона (Португалия), инженером в области электроники и компьютерной техники. Можно познакомиться с его оригинальными статьями здесь. Он написал ещё много полезных уроков и проектов про ESP32, ESP8266, и, если интересно, можно почитать его блог.
      У DFRobot есть много других обучающих статей по связке ESP32 с ардуино и готовых проектов на основе ESP32.
×
×
  • Create New...