Python3解析字节数组并获取最大receivedTimestamp值
解决连续拼接JSON的解析与最大值提取问题
首先,你的问题核心在于这段数据是两个独立JSON对象直接拼接而成的非标准JSON格式,直接用json.loads()解析肯定会失败。而且原始字节里还包含HTML实体",得先处理成正常的双引号。下面给你两种可行的解决方法,优先推荐第二种更健壮的方案:
方法一:简单分割(适合格式固定的场景)
如果你的数据始终是多个{...}直接拼接,没有嵌套的{},可以先把HTML实体替换成双引号,再用'}{'作为分隔符拆分,最后给拆分后的每个片段补上首尾的括号,再逐个解析:
import json # 原始字节数组 raw_data = b'{"receivedTimestamp":1604484102747,"application":"MMT","messageType":"BusEvent","utcTimestamp":1604484102711,"data":[{"id":56476901531}]}{"receivedTimestamp":1604484102748,"application":"MMT","messageType":"BusEvent","utcTimestamp":1604484102711,"data":[{"id":56476901532}]}' # 1. 解码为字符串并替换HTML实体 json_str = raw_data.decode('utf-8').replace('"', '"') # 2. 拆分拼接的JSON对象 json_parts = json_str.split('}{') # 给每个片段补全括号 json_objs = [] for i, part in enumerate(json_parts): if i == 0: # 第一个片段只需要补结尾的} full_part = part + '}' elif i == len(json_parts)-1: # 最后一个片段只需要补开头的{ full_part = '{' + part else: full_part = '{' + part + '}' json_objs.append(json.loads(full_part)) # 3. 提取最大的receivedTimestamp max_ts = max(obj['receivedTimestamp'] for obj in json_objs) print(max_ts) # 输出: 1604484102748
方法二:用JSONDecoder.raw_decode(健壮通用方案)
如果数据里可能有嵌套的{}(比如data字段里的对象),简单分割会出错。这时可以用Python标准库的json.JSONDecoder.raw_decode()方法,它能解析出一个合法的JSON对象,并返回解析后剩余的字符串,循环处理直到所有数据都解析完成:
import json raw_data = b'{"receivedTimestamp":1604484102747,"application":"MMT","messageType":"BusEvent","utcTimestamp":1604484102711,"data":[{"id":56476901531}]}{"receivedTimestamp":1604484102748,"application":"MMT","messageType":"BusEvent","utcTimestamp":1604484102711,"data":[{"id":56476901532}]}' # 处理HTML实体并转成字符串 json_str = raw_data.decode('utf-8').replace('"', '"') decoder = json.JSONDecoder() pos = 0 json_objs = [] while pos < len(json_str): try: obj, pos = decoder.raw_decode(json_str, pos) json_objs.append(obj) except json.JSONDecodeError: # 跳过可能的空白字符(如果有的话) pos += 1 # 提取最大值 max_ts = max(obj['receivedTimestamp'] for obj in json_objs) print(max_ts) # 输出: 1604484102748
关键步骤说明
- HTML实体替换:原始字节里的
"是HTML的双引号实体,必须先替换成"才能被JSON解析器识别。 - 非标准JSON的拆分:拼接的JSON不是合法的JSON数组,所以必须拆分成单个合法对象再解析,
raw_decode是最可靠的方式,能处理嵌套结构。 - 最大值提取:用生成器表达式遍历所有解析后的对象,直接取
receivedTimestamp的最大值即可。
内容的提问来源于stack exchange,提问作者Naveen Srikanth
相关产品推荐
相关产品推荐

