Flutter JSON解析插件gson的使用

Flutter JSON解析插件gson的使用

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  gson: ^0.1.4

然后在 Dart 文件中导入该包:

import 'package:gson/gson.dart';

使用

解码和编码

要解码 JSON 字符串,可以使用 gson.decode 方法。要编码对象为 JSON 字符串,可以使用 gson.encode 方法。

示例代码

以下是一个完整的示例代码,展示了如何使用 gson 包进行 JSON 的解析与生成:

import 'dart:convert';
import 'package:gson/gson.dart';

void main() {
  // 基本编码示例
  var encodedJson = gson.encode({
    "a": "a",
    "b": ["hello", "world"],
    "c": 1,
    "d": false,
    "e": Byte(26)
  });
  print(encodedJson); // 输出: {"a":"a","b":["hello","world"],"c":1,"d":false,"e":26b}

  // 如果你想在输出中得到一个 double 类型,你需要插入 Double 类
  var doubleEncoded = gson.encode(Double(1.0));
  print(doubleEncoded); // 输出: 1.0d

  // 因为 Dart 没有不同类型的数字(只有 num, int 和 double),API 提供了这些类型。
  // 所以如果你想在输出中得到一个 double 类型,你需要插入 Double 类
  var decodedDouble = gson.decode("1.0d").value;
  print(decodedDouble); // 输出: 1.0

  // 因为在 gson 中布尔值被显示为字节类型,所以布尔值存在于 Byte 类型中
  var boolEncoded = gson.encode(true);
  print(boolEncoded); // 输出: 1b
  var decodedBool = gson.decode("1b");
  print(decodedBool.value); // 输出: 1
  print(decodedBool.boolValue); // 输出: true (0b 将输出 false)

  // 使用 beautify 参数使输出更美观
  var beautifiedJson = gson.encode({
    "a": "a",
    "b": ["hello", "world"],
    "c": 1,
    "d": false,
    "e": Byte(26)
  }, beautify: true);
  print(beautifiedJson);
  // 输出:
  // {
  //   a: "a",
  //   b: [
  //     "hello",
  //     "world"
  //   ],
  //   c: 1,
  //   d: false,
  //   e: 26b
  // }

  // 使用 indent 参数控制缩进的数量
  var indentedJson = gson.encode({
    "a": "a",
    "b": ["hello", "world"],
    "c": 1,
    "d": false,
    "e": Byte(26)
  }, beautify: true, indent: 4);
  print(indentedJson);
  // 输出:
  // {
  //     a: "a",
  //     b: [
  //         "hello",
  //         "world"
  //     ],
  //     c: 1,
  //     d: false,
  //     e: 26b
  // }
}

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

1 回复

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


在Flutter中,处理JSON数据时,你可以使用dart:convert库来进行JSON的编码和解码。虽然Flutter没有直接提供类似于Android中的Gson库,但你可以使用一些第三方库来简化JSON的解析过程,例如json_serializablebuilt_value

1. 使用 dart:convert 进行手动解析

首先,你可以使用Flutter内置的dart:convert库来手动解析JSON数据。

import 'dart:convert';

void main() {
  String jsonString = '''
  {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com"
  }
  ''';

  Map<String, dynamic> userMap = jsonDecode(jsonString);

  print('Name: ${userMap['name']}');
  print('Age: ${userMap['age']}');
  print('Email: ${userMap['email']}');
}

2. 使用 json_serializable 自动生成解析代码

json_serializable是一个流行的第三方库,它可以自动生成JSON序列化和反序列化的代码。

安装依赖

pubspec.yaml中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.8.0

dev_dependencies:
  build_runner: ^2.3.3
  json_serializable: ^6.6.0

创建模型类

创建一个模型类,并使用@JsonSerializable注解。

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  final String name;
  final int age;
  final String email;

  User({required this.name, required this.age, required this.email});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  Map<String, dynamic> toJson() => _$UserToJson(this);
}

生成代码

运行以下命令生成序列化代码:

flutter pub run build_runner build

这将生成user.g.dart文件,其中包含_$UserFromJson_$UserToJson方法。

使用生成的代码

import 'dart:convert';
import 'user.dart';

void main() {
  String jsonString = '''
  {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com"
  }
  ''';

  Map<String, dynamic> userMap = jsonDecode(jsonString);
  User user = User.fromJson(userMap);

  print('Name: ${user.name}');
  print('Age: ${user.age}');
  print('Email: ${user.email}');
}

3. 使用 built_value 进行更复杂的序列化

built_value是另一个强大的库,适用于更复杂的序列化需求,尤其是当你需要不可变对象时。

安装依赖

pubspec.yaml中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.7.0

dev_dependencies:
  build_runner: ^2.3.3
  built_value_generator: ^8.7.0

创建模型类

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'user.g.dart';

abstract class User implements Built<User, UserBuilder> {
  String get name;
  int get age;
  String get email;

  User._();
  factory User([void Function(UserBuilder) updates]) = _$User;

  static Serializer<User> get serializer => _$userSerializer;
}

生成代码

运行以下命令生成序列化代码:

flutter pub run build_runner build

使用生成的代码

import 'dart:convert';
import 'user.dart';
import 'serializers.dart';

void main() {
  String jsonString = '''
  {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com"
  }
  ''';

  User user = serializers.deserializeWith(
      User.serializer, jsonDecode(jsonString));

  print('Name: ${user.name}');
  print('Age: ${user.age}');
  print('Email: ${user.email}');
}
回到顶部