Python3: поиск нескольких объектов JSON в байтовом массиве - PullRequest
0 голосов
/ 23 октября 2019

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

Проблема

Проблема заключается в том, что несколько сообщений могут встречаться одновременно. Когда я декодирую массивы, данные выглядят так:

{"time":1571813129,"device":"abc","count":0}{"time":1571813129,"device":"def","count":0}

Там, где несколько строк вместе, которые я пытаюсь разделить простым способом, чтобы затем преобразовать в JSON.

Код

x = ser1.read(256)
if x:
    x = x.decode()

Я также попытался ser1.readline(), но данные все еще находятся на той же строке, поэтому я вернулся к той же проблеме.

Вопрос

Как лучше всего справиться с этой ситуацией?

  • Струны разной длины (я поставил read(256), чтобы их было более чем достаточно)
  • Есть несколько сообщений, поступающих одновременно (в настоящее время это строки, но я хочу разбить их на отдельные объекты JSON)

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

После публикации вопроса я пошел дальше, чтобы найти } в строке. Затем зациклите позиции - используя их как начало и конец для нарезки. Не красиво, но это работает.

def find_char(data, c):
    return [pos for pos, char in enumerate(data) if char == c]


def find_objects(data):
    json_objects = []
    # Find the '}'
    pos_list = find_char(data, '}')
    # Loop over positions of }
    for x in pos_list:
        p = pos_list.index(x)
        # If the first object
        if p == 0:
            start = 0
            end = x + 1
        else:
            # For multiple objects
            if len(data) == x:
                # If the last object
                end = x
            else:
                # If in the middle of the string
                end = x + 1
            start = pos_list[p - 1] + 1
        json_objects.append(data[start:end])
    return json_objects
0 голосов
/ 23 октября 2019

Вы можете собрать фрагменты в строку и найти }{ в ней

buf=''
while True:
  frag=ser1.read(256)
  buf.append(frag.decode()) # perhaps with that if, I do not know the API
  try
    i=buf.find('}{')
    while i>=0:
      msg=json.loads(buf[:i+1])
      use(msg)
      buf=buf[i+1:]
      i=buf.find('}{')
...