Flutter 字符串与JSON相互转化

本文分享了在Flutter中处理JSON数据的正确方式,对比了toString()与jsonEncode的区别,强调了功能模块化的重要性,并通过实例展示了如何避免因代码复用过度而导致的bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

近期调接口加密,iOS原生已经调通的情况下,直接把iOS里的Objective-C代码拷贝到flutter的插件包里调用,居然花了我3天时间,遇到的问题基本上都很无理头的情况,比如本来需要传输json字符串,结果直接传了toString()字符串,另外一个就是过度为了追求代码的复用,导致判断逻辑过于复杂,不利于查找bug,以后写代码尽量功能分离,不要为了追求代码的复用而牺牲代码的可读性,功能模块化

遇到的问题1:

使用toString()方法能将对象转换成字符串,但是会丢失引号等信息,不再是标准JSON,导致服务端解析不正常

json转换为字符串


 

import 'dart:convert' as convert;
/// json转换为字符串
void testJson2String(){
  var user = { "name": "John Smith", "email": "john@example.com"};
  String jsonString = convert.jsonEncode(user);
  String normalString2 = user.toString();
  print('打印对象: $user');
  print('打印toString: $normalString2');
  print('打印JSON: $jsonString');
  var nameList = ["小明","韩梅梅","李华"];
  String normalNameString = nameList.toString();
  String josnNameString = convert.jsonEncode(nameList);
  print(nameList);
  print(normalNameString);
  print(josnNameString);
}

打印结果

打印对象: {name: John Smith, email: john@example.com}
打印toString: {name: John Smith, email: john@example.com}
打印JSON: {"name":"John Smith","email":"john@example.com"}
[小明, 韩梅梅, 李华]
[小明, 韩梅梅, 李华]
["小明","韩梅梅","李华"]

字符串转json


 

/// 字符串转json
void testString2Json(){
  var jsonTxt1 = '{ "name": "John Smith", "email": "john@example.com"}';
  Map<String, dynamic> user = convert.jsonDecode(jsonString1);
  var jsonTxt2 = '["小明","韩梅梅","李华"]';
  List nameList = convert.jsonDecode(jsonTxt2);
}



作者:独孤流
链接:https://www.jianshu.com/p/58a86bb75f6b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### JSON 换在 Flutter 中的应用 以下是关于如何在 Flutter 中实现 JSON 换的一个完整示例代码: #### 定义数据模型并启用 `json_serializable` 为了简化 JSON 和 Dart 对象之间的换过程,推荐使用 `json_serializable` 包来生成序列化/反序列化的代码。 ```dart import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; // 自动生成的部分 @JsonSerializable() class User { @JsonKey(name: 'user-name') // 将 JSON 键映射到 Dart 字段 String? name; int? age; User({this.name, this.age}); /// 反序列化工厂方法 factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); /// 序列化方法 Map<String, dynamic> toJson() => _$UserToJson(this); } ``` 此部分定义了一个简单的 `User` 类,并利用了 `@JsonSerializable()` 注解以及 `@JsonKey` 来支持自定义键名映射[^3]。 --- #### 主函数中的 JSON 解析编码 以下是一个完整的解析和编码流程演示: ```dart import 'dart:convert'; import 'package:flutter/material.dart'; import './user.dart'; // 导入上面的数据模型文件 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: ElevatedButton( onPressed: () async { _processJson(); }, child: Text('Process JSON'), ), ), ), ); } } Future<void> _processJson() async { // 示例 JSON 数据字符串 String jsonString = '{"user-name": "Alice", "age": 28}'; // 解码 JSON 到 Map Map<String, dynamic> userMap = json.decode(jsonString); // 创建对象实例 var user = User.fromJson(userMap); print('Name: ${user.name}, Age: ${user.age}'); // 编码回 JSON 字符串 String encodedJson = json.encode(user.toJson()); print('Encoded JSON: $encodedJson'); } ``` 在此代码中展示了如何将 JSON 字符串转化为 Dart 对象,再将其重新编码为 JSON 字符串的过程[^1]。 --- #### 如何生成 `.g.dart` 文件? 为了让上述代码正常工作,需要确保已安装依赖项 `build_runner` 并执行命令以生成辅助代码文件。具体操作如下: ```bash flutter pub get flutter pub run build_runner build --delete-conflicting-outputs ``` 这一步骤会基于您的数据模型类生成对应的 `_$.g.dart` 文件,其中包含了 `fromJson` 和 `toJson` 方法的具体实现逻辑[^5]。 --- #### 高级功能:自定义换器 当遇到更复杂的场景时(例如日期时间字段或其他特定类型的处理),可以通过创建自定义的 `JsonConverter` 来解决这些问题。例如: ```dart import 'package:json_annotation/json_annotation.dart'; // 自定义换器用于 DateTime 类型 class DateTimeConverter implements JsonConverter<DateTime, String> { const DateTimeConverter(); @override DateTime fromJson(String json) => DateTime.parse(json).toLocal(); // 根据需求调整格式 @override String toJson(DateTime object) => object.toIso8601String(); } @JsonSerializable(converters: [DateTimeConverter()]) class Event { final DateTime date; Event({required this.date}); factory Event.fromJson(Map<String, dynamic> json) => _$EventFromJson(json); Map<String, dynamic> toJson() => _$EventToJson(this); } ``` 这里展示的是针对 `DateTime` 类型的自定义换机制[^4]。 --- ### 总结 以上内容涵盖了从基础到高级的各种 JSON 换技巧,包括但不限于手动编写、工具自动化生成以及应对复杂情况下的解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值