Чтение данных JSON из байтовой строки в кодировке UTF-8 - PullRequest
0 голосов
/ 27 октября 2018

У меня есть скрипт, который отправляет байтовую строку в кодировке JSON UTF-8 в сокет. (Проект github: https://github.com/alios/raildriver). Сейчас я пишу скрипт на python, который должен читать входящие данные. Прямо сейчас я могу получить данные и распечатать их на терминал. С помощью следующего скрипта: https://www.binarytides.com/code-telnet-client-sockets-python/

Выход:

data = '{"Current": 117.42609405517578, "Accelerometer": -5.394751071929932, "SpeedometerKPH": 67.12493133544922, "Ammeter": 117.3575210571289, "Amp": 117.35590362548828, "Acceleration": -0.03285316377878189, "TractiveEffort": -5.394751071929932, "Effort": 48.72163772583008, "RawTargetDistance": 3993.927734375, "TargetDistanceBar": 0.9777777791023254, "TargetDistanceDigits100": -1.0, "TargetDistanceDigits1000": -1.0}'

Проблема в том, что я не могу найти, как читать массив JSON. Например, прочитайте "Ammeter" и верните его значение 117.357521057289 в новую переменную.

Все данные принимаются в переменной data

Код, который я сейчас имею:

decodedjson = data.decode('utf-8')
dumpedjson = json.dumps(decodedjson)
loadedjson = json.loads(dumpedjson)

Можете ли вы помочь мне?

1 Ответ

0 голосов
/ 27 октября 2018

Вы кодируете в JSON, затем снова декодируете. Просто не кодировать , убрать вторую строку:

decodedjson = data.decode('utf-8')
loadedjson = json.loads(decodedjson)

Если вы используете Python 3.6 или новее, вам на самом деле не нужно декодировать из UTF-8, поскольку функция json.loads() знает, как обращаться с данными JSON в кодировке UTF напрямую. То же самое относится к Python 2:

loadedjson = json.loads(data)

Демонстрация с использованием Python 3.7:

>>> data = b'{"Current": 117.42609405517578, "Accelerometer": -5.394751071929932, "SpeedometerKPH": 67.12493133544922, "Ammeter": 117.3575210571289, "Amp": 117.35590362548828, "Acceleration": -0.03285316377878189, "TractiveEffort": -5.394751071929932, "Effort": 48.72163772583008, "RawTargetDistance": 3993.927734375, "TargetDistanceBar": 0.9777777791023254, "TargetDistanceDigits100": -1.0, "TargetDistanceDigits1000": -1.0}'
>>> loadedjson = json.loads(data)
>>> loadedjson['Ammeter']
117.3575210571289
...