Flutter JSON处理插件whats_json的使用

发布于 1周前 作者 sinazl 来自 Flutter

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/202225-04-20222022.04.25 这样的简单日期格式,也支持本地化的 Tuesday, 25 April 2022

除了公历外,还支持佛教历 3/18/2565 BE 和日本皇历 3/18/R4。阿拉伯语右到左的日期也可以正常工作,如 ٢٧‏/٣‏/٢٠٢٢، ٩:٥٣:٥٦ م

消息类型

消息分为 TextImageVideoAudioGIFStickerFileLocationSystem 几种类型。

文本

多行纯文本消息

[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"
}

类型全部小写 - imagevideoaudiogifstickerfile

位置

位置消息有两种格式,取决于使用的服务是 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

1 回复

更多关于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

注意事项

  1. 依赖版本:确保你使用的是 whats_json 的最新版本,因为插件的 API 可能会随着版本更新而发生变化。
  2. 错误处理:在实际应用中,你可能需要添加适当的错误处理逻辑,以处理 JSON 解析过程中可能出现的异常情况。

通过以上代码示例,你可以看到如何使用 whats_json 插件来简化 Flutter 应用中的 JSON 处理工作。希望这个示例对你有帮助!

回到顶部