You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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'),转换逻辑固定:

  1. 取payload第一个字节,与0x1F做与运算得到语言码长度
  2. 跳过「1字节状态位 + 语言码长度」的偏移位置,截取剩余字节
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:54:03