使用Dart解码含Mifare、NDEF字段的非标准JSON的方法咨询
实现思路
1. 预处理非标准JSON为合法格式
你提供的原始JSON属于未给键加双引号的简化格式,无法直接通过Dart内置JSON解析工具解析,需要先做预处理。如果你的数据本身已经是Dart Map结构,可以直接跳过这一步。
预处理逻辑可通过正则替换实现,Dart代码示例:
String rawJsonStr = '''{ mifare: { identifier: [4, 119, 66, 185, 196, 77, 112], mifareFamily: 2, historicalBytes: [] }, ndef: { isWritable: true, maxSize: 492, cachedMessage: {records: [{identifier: [], typeNameFormat: 1, type: [84], payload: [2, 101, 110, 123, 39, 99, 109, 100, 39, 58, 39, 110, 101, 119, 95, 102, 114, 105, 101, 110, 100, 39, 44, 39, 117, 115, 101, 114, 39, 58, 39, 116, 101, 115, 116, 39, 125]}]}}} '''; // 给所有未加双引号的键包裹双引号,转换为标准JSON格式 String standardJsonStr = rawJsonStr.replaceAllMapped(RegExp(r'(\w+):'), (match) => '"${match.group(1)}":');
2. 解析标准JSON为Dart对象
两种方案可选:
- 快速开发场景:直接解析为
dynamic类型,无需定义实体类 - 生产环境场景:定义对应结构的Dart实体类,搭配
json_serializable自动生成解析逻辑,保证类型安全
快速解析代码示例:
import 'dart:convert'; Map<String, dynamic> nfcData = jsonDecode(standardJsonStr);
3. 转换payload字节数组为可读文本
你提供的payload属于标准NDEF文本类型记录(typeNameFormat=1、type为[84]对应ASCII字符'T'),转换逻辑固定:
- 取payload第一个字节,与
0x1F做与运算得到语言码长度 - 跳过「1字节状态位 + 语言码长度」的偏移位置,截取剩余字节
- 用UTF-8解码剩余字节得到最终可读文本
代码示例:
// 取出payload字节数组 List<int> payload = nfcData['ndef']['cachedMessage']['records'][0]['payload']; // 计算偏移量 int langLength = payload[0] & 0x1F; int startOffset = 1 + langLength; // 解码为字符串 String readableContent = utf8.decode(payload.sublist(startOffset)); print(readableContent); // 输出结果:{'cmd':'new_friend','user':'test'}
内容的提问来源于stack exchange,提问作者Opgesy
相关产品推荐
相关产品推荐

