文章目录
我们在上一章回中介绍了"对dio库进行封装"相关的内容,本章回中将介绍 如何在Flutter中解析JSON数据 .闲话休提,让我们一起Talk Flutter吧。
概念介绍
我们在前面章回中介绍了通过dio发起Http相关的网络操作,这些操作的结果都是JSON格式的数据。我们在本章回中将介绍如何解析这些JSON数据。如果有看官不知道什么是JSON数据的话点击这里查看我以前的博客。
在项目中,我们使用的是dart中的类对象,这些类是依据项目需求封装而成的,解析的目标就是把JSON格式的数据转换成使用类封装的数据。JOSN的本质是String类型的数据,它与map类型相匹配,因此解析的本质就是把String类型的数据 转换成map类型的数据。
解析方法
convert库
如果我们自动去解析JSON的话比较麻烦,dart官方提供了convert
库来解析JSON数据,首先创建一个JsonDecoder
对象,然后使用该对象的convert()方法就可以把JSON字符串转换成Map类型的对象,具体内容可以参考示例代码。
该库还可以反向操作:把封装类中的数据转换成JSON格式的数据。操作步骤如下:首先创建一个
JsonEncoder
类型的对象,然后使用该对象的conver
()方法注可以Map类型的数据转换成JSON字符串。具体内容可以参考示例代码。
插件工具
除了官方提供的方法外,也有一些第三方提供了解析工具,比如我之前推荐的三方工具:FlutterJsonBeanFactory
,它可以通过插件的方式安装到AndroidStudio中,然后把JSON字符串复制到工具中,工具就会自动生成转换类(类名由自己指定),转换类提供了相关的方法给开发者使用,详细如下:
- fromJson()方法: 把JSON字符串转换成Dart类对象;
- toJson()方法: 把Dart类对象转换成JSON字符串;
这两个方法都是静态方法,可以通过类名来调用,详细的使用方法可以参考示例代码。该工具主打一个智能和自动,不过它也有缺点,会自动在lib目录下生成一个与类名相同的dart文件,该文件的名字不是驼峰命名法,而是使用了下划线命名方法,同时还会在lib目录下生成一个名叫generated
的目录,该目录中包含了工具生成的代码,这些代码就是上面两个转换方法的源代码。这些自动生成的文件和项目中原来的文件不一样,给项目的管理带来了麻烦。
示例代码
dart
///JSON字符串转换成Map类型的对象
const JsonDecoder decoder = JsonDecoder();
const String jsonString = '''
{
"data": [{"text": "foo", "value": 1 },
{"text": "bar", "value": 2 }],
"text": "Dart"
}
''';
final Map<String, dynamic> object = decoder.convert(jsonString);
final item = object['data'][0];
print(item['text']); // foo
print(item['value']); // 1
print(object['text']); // Dart
///Map类型的数据转换成JSON字符串
const JsonEncoder encoder = JsonEncoder();
const data = {'text': 'foo', 'value': '2'};
final String jsonString = encoder.convert(data);
print(jsonString); // {"text":"foo","value":"2"}
///使用插件工具解析
CustomClassType.fromJson(jsonString);
CustomClassType.toJson(data);
以上示例代码来源于convet库官方给出的示例。更加详细的内容可以参考官方文档。使用工具解析时代码比较少,主要是复用了部分官方代码。我在这里就不演示程序的运行结果了,建议大家自己动手去实践。
经验总结
我们在本章回中介绍了两种解析JSON数据的方法,它们有各自的优缺点,详细总结如下:
- convert库:官方提供的,比较权威,使用也很方便,对于简单的JSON字符串使用容易,对于复杂的JSON字符串使用繁杂,主要是需要手写多个map中的key。
- 插件工具:三方提供,比较流行,集智能和自动化于一身,使用十分简单,缺点是生成了许多与项目不一致的文件,影响项目管理。
大家可以依据自身项目的需求,结合以上两种方法的优缺点选择其中一种解析方法。以上仅是个人经验,欢迎大家在评论区交流与讨论。
看官们,关于"在Flutter中解析JSON数据"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!