Flutter JSON处理插件whats_json的使用
Flutter JSON处理插件whats_json的使用
whats_json
是一个用于从 WhatsApp _chat.txt
文件中提取消息并将其转换为 JSON 格式的 Dart 包和命令行工具。
功能
- 支持个人和群聊,包括 iOS 和 Android 导出格式。
- 支持附件和位置信息。
- 可以识别系统消息,不受语言限制。
- 处理多种日历和本地日期格式。
- 跨平台,利用 Dart 的强大功能。
命令行工具
简单的命令行应用提供了将导出的 _chat.txt
文件转换为 JSON 文件的接口。更多信息可以查看 此处。
dart cli.dart -i chat.txt -o chat.json
包
Dart 包支持所有平台,包括 Web。只需在 pubspec.yaml
中包含最新版本即可:
// 读取文件
final stream = File("_chat.txt")
.openRead()
.transform(const Utf8Decoder())
.transform(const LineSplitter());
// 获取消息
List<Map<String, dynamic>> messages = await whatsGetMessages(stream);
字段
当消息被处理时,结果中可能会出现以下字段:
名称 | 必填 | 值 | 描述 |
---|---|---|---|
type | 必填 | text, image, video, audio, gif, sticker, file, location, system | 消息类型,根据此字段可确定哪些字段存在或不存在 |
text | 必填 | 文本字符串 | 纯文本 |
author | 选填 | 字符串 | 发送者姓名或电话号码 |
date | 当日期为空时,date 字段不存在,则会出现 dateString 和 timeString 字段 | 正整数 | 自纪元以来的秒数(UTC) |
dateString | 仅当 date 字段为空时存在 | 字符串 | 原始日期字符串,在日期和时间处理失败时存储 |
timeString | 仅当 date 字段为空时存在 | 字符串 | 原始时间字符串,在日期和时间处理失败时存储 |
uri | 必填 | 字符串 | 媒体文件名 |
link | 必填 | 合法的 HTTPS 链接 | Google 地图或 Foursquare 位置链接 |
longitude | 选填 | 字符串 | 解析自 Google 地图链接的经度值 |
latitude | 选填 | 字符串 | 解析自 Google 地图链接的纬度值 |
日期格式和日历
库支持诸如 4/25/2022
、25-04-2022
、2022.04.25
这样的简单日期格式,也支持本地化的 Tuesday, 25 April 2022
。
除了公历外,还支持佛教历 3/18/2565 BE
和日本皇历 3/18/R4
。阿拉伯语右到左的日期也可以正常工作,如 ٢٧/٣/٢٠٢٢، ٩:٥٣:٥٦ م
。
消息类型
消息分为 Text
、Image
、Video
、Audio
、GIF
、Sticker
、File
、Location
和 System
几种类型。
文本
多行纯文本消息
[3/27/22, 21:41:35] Elon Musk: Hello, Space!
处理后的 JSON:
{
"type": "text",
"author": "Elon Musk",
"date": 1648417295,
"text": "Hello, Space!"
}
附件:图片、视频、音频、GIF、贴纸、文件
附件类型基于文件名首先进行检测,然后通过 mime
包根据文件扩展名进行检测。
iOS
[3/27/22, 21:41:55] Elon Musk: <attached: 00000001-PHOTO-2022-03-27-21-41-55.jpg>
Android
27/03/2022, 21:41:55 - Elon Musk: IMG-20220327-WA0001.jpg (file attached)
JSON
{
"type": "image",
"author": "Elon Musk",
"date": 1648417315,
"uri": "00000001-PHOTO-2022-03-27-21-41-55.jpg"
}
类型全部小写 - image
、video
、audio
、gif
、sticker
、file
。
位置
位置消息有两种格式,取决于使用的服务是 Google 地图还是 Foursquare。
iOS
[3/27/22, 21:56:45] Elon Musk: Location: https://maps.google.com/?q=51.5021456,-0.127397
[3/27/22, 21:46:03] Elon Musk: Pimlico Gardens (London, United Kingdom): https://foursquare.com/v/4e89af95e5fa82ad4c0aa03b
Android
27/03/2022, 21:56:45 - Elon Musk: location: https://maps.google.com/?q=51.50214569326172,-0.12739796972656
JSON (Google 地图)
{
"type": "location",
"author": "Elon Musk",
"date": 1648418205,
"link": "https://maps.google.com/?q=51.5021456,-0.127397",
"longitude": "51.5021456",
"latitude": "-0.127397"
}
JSON (Foursquare)
{
"type": "location",
"author": "Elon Musk",
"date": 1648417563,
"link": "https://foursquare.com/v/4e89af95e5fa82ad4c0aa03b",
"text": "Pimlico Gardens (London, United Kingdom)"
}
系统消息
所有系统消息都已翻译并导出为用户本地语言。这些翻译是从原始 WhatsApp 本地化字符串收集的。
[3/18/22, 14:56:01] Elon Musk: Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them.
[1/7/23, 23:32:30] Elon Musk: Your security code with Elon changed. Tap to learn more.
处理后的 JSON:
{
"type": "system",
"text": "Messages and calls are end-to-end encrypted. No one outside of this chat, not even WhatsApp, can read or listen to them.",
"author": "Elon Musk",
"date": 1647615361
},
{
"type": "system",
"text": "Your security code with Elon changed. Tap to learn more.",
"author": "Elon Musk",
"date": 1673134350
},
更多关于Flutter JSON处理插件whats_json的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON处理插件whats_json的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,whats_json
是一个用于 Flutter 的 JSON 处理插件,可以帮助开发者更方便地进行 JSON 的序列化和反序列化操作。以下是一个简单的代码示例,展示了如何使用 whats_json
插件来处理 JSON 数据。
首先,确保你已经在 pubspec.yaml
文件中添加了 whats_json
依赖:
dependencies:
flutter:
sdk: flutter
whats_json: ^最新版本号 # 请替换为实际的最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来是一个简单的示例,展示如何使用 whats_json
进行 JSON 的序列化和反序列化。
数据模型
首先,定义一个数据模型类:
import 'package:whats_json/whats_json.dart';
class User {
String name;
int age;
User({required this.name, required this.age});
// 使用 WhatsJson 提供的 fromJson 和 toJson 方法
factory User.fromJson(Map<String, dynamic> json) => WhatsJson.fromJson(json, User());
Map<String, dynamic> toJson() => WhatsJson.toJson(this);
}
序列化和反序列化示例
接下来,展示如何将一个 User
对象序列化为 JSON 字符串,以及如何将一个 JSON 字符串反序列化为 User
对象。
void main() {
// 创建一个 User 对象
User user = User(name: "Alice", age: 30);
// 将 User 对象序列化为 JSON 字符串
String jsonString = user.toJson().toString();
print("Serialized JSON: $jsonString");
// 将 JSON 字符串反序列化为 User 对象
Map<String, dynamic> jsonMap = jsonDecode(jsonString);
User deserializedUser = User.fromJson(jsonMap);
print("Deserialized User: name=${deserializedUser.name}, age=${deserializedUser.age}");
}
运行结果
运行上述代码后,你将看到类似以下的输出:
Serialized JSON: {"name":"Alice","age":30}
Deserialized User: name=Alice, age=30
注意事项
- 依赖版本:确保你使用的是
whats_json
的最新版本,因为插件的 API 可能会随着版本更新而发生变化。 - 错误处理:在实际应用中,你可能需要添加适当的错误处理逻辑,以处理 JSON 解析过程中可能出现的异常情况。
通过以上代码示例,你可以看到如何使用 whats_json
插件来简化 Flutter 应用中的 JSON 处理工作。希望这个示例对你有帮助!