Отправить целые числа через гнездо данных Python с фиксированным размером - PullRequest
0 голосов
/ 04 декабря 2018

Я пытался отправить некоторые целочисленные значения через сокет клиенту LabVIEW, используя json.dumps, но по мере изменения чисел размер каждого поля может измениться, я хотел бы знать, есть ли способ дополнить числос '0', не превращая его в строку, когда я выполняю дамп json, поскольку он добавляет " " к пакету, посылаемому вокруг каждого числа.

Пример:

data = json.dumps({"Data": str(52).zfill(4)]})
self.sock.send(data.encode())

Это отправляет

'"Data":"0052"'

Я хочу

'"Data": 0052'

1 Ответ

0 голосов
/ 05 декабря 2018

Как упомянул @jsonharper, технически то, что вы просите, больше не является JSON, подробнее об этом здесь

Однако это не означает, что вы не можете использовать *Библиотека 1005 *, чтобы выполнить большую часть работы за вас!

Этого можно добиться, передав пользовательский класс кодировщика в json.dumps следующим образом:

>>> import json

>>> class MyInt(int):
...     def __str__(self):
...         return '{:0>4}'.format(self)

>>> class MyEncoder(json.encoder.JSONEncoder):
...     def default(self, o):
...         if isinstance(o, MyInt):
...             return str(o)
...         return super(MyEncoder, self).default(o)

>>> obj = {'Data': MyInt(52)}
>>> json.dumps(obj, cls=MyEncoder)
'{"Data": 0052}'

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

Посмотрите, сможете ли вы заставить LabVIEW читать стандартный JSON, но если нет, товыше должно работать.

...