Flutter JSON处理插件json_lib的使用

Flutter JSON处理插件json_lib的使用

此库旨在简化与JSON数据的工作。

  • 直观的API
  • 不需要代码生成
  • 支持必需和可选的JSON数据
  • 描述性的错误报告

动机

当您:

  • 对自动代码生成的反序列化不感兴趣。
  • 在处理意外的JSON数据时希望有更好的控制。
  • 只想通过路径或名称读取部分JSON数据。

API

该库有两种形式的API - 独立函数和扩展功能,适用于Map<String, dynamic>List<dynamic>

每个JSON读取函数都有两种变体:

  • ‘严格’ - 预期数据存在且不为空。如果数据缺失,则会抛出异常并解释缺少的部分。
  • '尝试’前缀 - 函数将返回null。

每个函数都有一个可选的’mapper’参数,可以用于将检索到的值映射到预期的数据类型。

有两个方便的函数asJsonMap(dynamic)asJsonList(dynamic),它们与扩展方法一起使用。

使用

要查看完整的API和代码示例,请参阅json_lib_testjson_lib_extensions_test

导入

import 'package:json_lib/json_lib.dart';
// 如果使用扩展方法,请添加以下导入
import 'package:json_lib/json_lib_extensions.dart';

属性名称和列表索引(独立函数)

final dynamic data = {'intField': 5, 'stringField': 'foo', 'doubleField': 2.3, 'nullField': null};
final dynamic dataList = <dynamic>[1, 'foo', 3];

final double someValue = jsonValue('doubleField', data); // 2.3
final double someValue = tryJsonValue('missing_field', data); //null

final String val = jsonListItem(1, dataList); // 'foo'
final String val = tryJsonListItem(300, dataList); // null

属性名称和列表索引(扩展方法)

final jsonObject = asJsonMap(data);
final jsonList = asJsonList(dataList);

final double someValue = jsonObject.value('doubleField'); // 2.3
final double someValue = jsonObject.tryValue('missing_field'); // null
final String val = jsonList.listItem(1); // 'foo'
final String val = jsonList.tryListItem(300); // null

使用路径

// 示例数据
final dynamic responseBody = [{
    'name': 'Songs from a Room',
    'genre': 'Folk',
    'artist': {
      'name': 'Leonard Cohen',
    },
    'tracks': [
      {'name': 'Bird on the Wire', 'duration': 208},
      {'name': 'Story of Isaac', 'duration': 218},
      {'name': 'A Bunch of Lonesome Heroes', 'duration': 198},
    ]
  }
];

独立函数

// 这将抛出异常,如果路径未找到,并描述数据中缺少哪一部分
final int trackDuration = jsonPathValue([1, 'tracks', 0, 'duration'], responseBody); // 208
// 这不会抛出异常,而是返回可空值
final int? trackDuration = tryJsonPathValue([1, 'tracks', 0, 'duration'], responseBody); // 208
final int? trackDuration = tryJsonPathValue([5, 'tracks', 0, 'duration'], responseBody); // null - 索引5超出范围

扩展方法

final jsonData = asList(responseBody);
// 这将抛出异常,如果路径未找到,并描述数据中缺少哪一部分
final int trackDuration = jsonData.pathValue([1, 'tracks', 0, 'duration']);  // 208
// 这不会抛出异常,而是返回可空值
final int? trackDuration = jsonData.tryPathValue([1, 'tracks', 0, 'duration']);  // 208
final int? trackDuration = jsonData.tryPathValue([5, 'tracks', 0, 'duration']);  // null - 索引5超出范围

使用映射器参数

enum Genre { Rock, Jazz, Pop, Folk }

Genre? tryParseGenre(dynamic value) {
  return Genre.values.firstWhereOrNull((e) => e.toString().toLowerCase() == 'genre.${value.toString().toLowerCase()}');
}

Genre genre = albumsJson.pathValue([0, 'genre'], tryParseGenre); // Genre.Folk

反序列化分层数据

static Album deserialize(dynamic data) {
  final json = asJsonMap(data);
  return Album(
    name: json.value('name'),
    artist: json.value('artist', Artist.deserialize),
    tracks: json.valueList('tracks', Track.deserialize),
    genre: json.value('genre', tryParseGenre),
  );
}

static Artist deserialize(dynamic data) {
  final json = asJsonMap(data);
  return Artist(
    name: json.value('name'),
    founded: json.tryValue('founded'),
    members: json.tryValueList('members') ?? [],
  );
}

static Track deserialize(dynamic data) {
  final json = asJsonMap(data);
  return Track(
    name: json.value('name'),
    duration: json.tryValue('duration'),
  );
}

完整示例代码

// example/json_lib_example.dart

import 'package:json_lib/json_lib.dart';
import 'package:json_lib/json_lib_extensions.dart';

void main() {
  // 示例数据
  final dynamic responseBody = [
    {
      'name': 'Songs from a Room',
      'genre': 'Folk',
      'artist': {
        'name': 'Leonard Cohen',
      },
      'tracks': [
        {'name': 'Bird on the Wire', 'duration': 208},
        {'name': 'Story of Isaac', 'duration': 218},
        {'name': 'A Bunch of Lonesome Heroes', 'duration': 198},
      ]
    }
  ];

  // 使用路径获取数据
  final jsonData = asList(responseBody);
  final int? trackDuration = jsonData.tryPathValue([1, 'tracks', 0, 'duration']);
  print('Track Duration: $trackDuration');

  // 反序列化示例数据
  final album = Album.deserialize(responseBody[0]);
  print('Album Name: ${album.name}');
  print('Artist Name: ${album.artist.name}');
  print('Tracks: ${album.tracks.map((track) => track.name)}');
}

更多关于Flutter JSON处理插件json_lib的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON处理插件json_lib的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


json_lib 是一个轻量级的 Flutter JSON 处理库,它提供了一种简单的方式来解析和生成 JSON 数据。虽然 Flutter 自带了 dart:convert 库来处理 JSON,但 json_lib 提供了一些额外的功能和便利性,特别是在处理复杂的 JSON 结构时。

安装 json_lib

首先,你需要在 pubspec.yaml 文件中添加 json_lib 依赖:

dependencies:
  flutter:
    sdk: flutter
  json_lib: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

使用 json_lib

1. 解析 JSON 字符串

你可以使用 JsonLib.decode 来将 JSON 字符串解析为 Dart 对象。

import 'package:json_lib/json_lib.dart';

void main() {
  String jsonString = '{"name": "John", "age": 30, "isStudent": false}';
  
  var jsonObject = JsonLib.decode(jsonString);
  
  print(jsonObject["name"]);  // 输出: John
  print(jsonObject["age"]);   // 输出: 30
  print(jsonObject["isStudent"]);  // 输出: false
}

2. 生成 JSON 字符串

你可以使用 JsonLib.encode 来将 Dart 对象转换为 JSON 字符串。

import 'package:json_lib/json_lib.dart';

void main() {
  var user = {
    "name": "John",
    "age": 30,
    "isStudent": false
  };
  
  String jsonString = JsonLib.encode(user);
  
  print(jsonString);  // 输出: {"name":"John","age":30,"isStudent":false}
}

3. 处理嵌套的 JSON 数据

json_lib 也可以处理嵌套的 JSON 数据。

import 'package:json_lib/json_lib.dart';

void main() {
  String jsonString = '''
  {
    "name": "John",
    "age": 30,
    "address": {
      "city": "New York",
      "zipcode": "10001"
    },
    "hobbies": ["reading", "traveling"]
  }
  ''';
  
  var jsonObject = JsonLib.decode(jsonString);
  
  print(jsonObject["name"]);  // 输出: John
  print(jsonObject["address"]["city"]);  // 输出: New York
  print(jsonObject["hobbies"][0]);  // 输出: reading
}

4. 处理复杂的 JSON 结构

json_lib 提供了 JsonObjectJsonArray 类来处理复杂的 JSON 结构。

import 'package:json_lib/json_lib.dart';

void main() {
  String jsonString = '''
  {
    "users": [
      {"name": "John", "age": 30},
      {"name": "Jane", "age": 25}
    ]
  }
  ''';
  
  var jsonObject = JsonLib.decode(jsonString);
  
  var users = jsonObject["users"] as JsonArray;
  
  for (var user in users) {
    print("Name: ${user["name"]}, Age: ${user["age"]}");
  }
  // 输出:
  // Name: John, Age: 30
  // Name: Jane, Age: 25
}
回到顶部