Flutter严格JSON解析插件strict_json的使用

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

Flutter严格JSON解析插件strict_json的使用

介绍

strict_json 插件允许您以严格的格式处理JSON动态数据。它可以帮助您在解析JSON时捕获缺失或错误的数据类型,并提供详细的错误信息。

示例代码

以下是 strict_json 的完整示例,展示如何使用该插件来解析JSON数据并将其转换为自定义对象。

import 'package:strict_json/strict_json.dart';

void main() {
  // 定义一个JSON字符串
  const String json = """{
    "products": [
      { "id": 1, "name": "Product 1", "price": 2.5, "data": "optional data" },
      { "id": 2, "name": "Product 2", "price": 3.0, "stock": true }
    ]
  }""";
  
  // 解析JSON字符串并将其转换为产品列表
  final productList = const Json(json).asMap().getJsonList("products").convertJsonMap((it) => Product(it)).toList();
  
  // 打印产品列表
  print(productList);
}

// 定义产品类
class Product {

  final int id;
  final String name;
  final double price;
  final String? data; // 可选字段
  final bool inStock;

  // 构造函数,从JsonMap中提取数据
  Product(JsonMap data):
    id = data.getInt("id"), // 获取整数类型的id
    name = data.getString("name"), // 获取字符串类型的name
    price = data.getDouble("price"), // 获取双精度浮点类型的price
    inStock = data.getBool("stock", false), // 获取布尔类型的stock,默认值为false
    data = data.getStringOr("data"); // 获取可选的字符串类型data

  // 覆写toString方法,方便打印输出
  @override
  String toString() => "Product(id: $id, name: $name, price: $price, data: $data, inStock: $inStock)";
}

输出结果

上述代码将打印以下内容:

strict_json: the field 'stock' is null but required ('bool' expected)
[ Product(id: 1, name: Product 1, price: 2.5, data: optional data, inStock: false), 
  Product(id: 2, name: Product 2, price: 3.0, data: null, inStock: true) ]

这段输出表明第一个产品的 stock 字段是 null,但期望是一个布尔值,因此插件会抛出警告。第二个产品则正确地解析了所有字段。

错误处理

您可以收集解析过程中产生的所有错误,并进行相应的处理,例如发送到分析系统:

FlutterError.onError = (FlutterErrorDetails details) {
  // 发送错误到分析系统,例如:
  // sendToAnalytics(details.exception.toString(), details.stack.toString());
};

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

1 回复

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


当然,以下是如何在Flutter项目中使用strict_json插件来进行严格JSON解析的代码示例。strict_json插件可以帮助你在Flutter应用中确保JSON数据的类型和结构符合预期,从而提高应用的健壮性和安全性。

首先,确保你已经在pubspec.yaml文件中添加了strict_json依赖:

dependencies:
  flutter:
    sdk: flutter
  strict_json: ^x.y.z  # 请替换为最新版本号

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

接下来,让我们看一个具体的代码示例,展示如何使用strict_json进行严格的JSON解析。

假设我们有以下JSON数据:

{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com",
  "isSubscribed": true
}

我们希望将其解析为一个Dart对象。首先,定义一个Dart类来表示这个JSON结构:

import 'package:strict_json/strict_json.dart';

class UserSchema extends StrictJsonSchema {
  @override
  Map<String, StrictJsonField> get fields => {
    'name': StrictJsonField(isRequired: true, type: StrictJsonType.string),
    'age': StrictJsonField(isRequired: true, type: StrictJsonType.int),
    'email': StrictJsonField(isRequired: true, type: StrictJsonType.string),
    'isSubscribed': StrictJsonField(isRequired: true, type: StrictJsonType.bool),
  };
}

class User {
  final String name;
  final int age;
  final String email;
  final bool isSubscribed;

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

  factory User.fromJson(Map<String, dynamic> json) {
    final schema = UserSchema();
    final validatedJson = schema.validate(json);
    
    return User(
      name: validatedJson['name'] as String,
      age: validatedJson['age'] as int,
      email: validatedJson['email'] as String,
      isSubscribed: validatedJson['isSubscribed'] as bool,
    );
  }
}

在上面的代码中,我们定义了一个UserSchema类,它继承自StrictJsonSchema并覆盖了fields属性。这个属性定义了JSON对象中每个字段的名称、是否必需以及字段的类型。然后,我们定义了一个User类,它包含一个从JSON映射到Dart对象的构造函数。在fromJson工厂方法中,我们使用UserSchema来验证JSON数据,确保它符合我们预期的格式和类型。

现在,我们可以使用以下代码来解析JSON数据并创建User对象:

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

  final jsonMap = jsonDecode(jsonString) as Map<String, dynamic>;

  try {
    final user = User.fromJson(jsonMap);
    print('User: ${user.name}, Age: ${user.age}, Email: ${user.email}, Subscribed: ${user.isSubscribed}');
  } catch (e) {
    print('Error parsing JSON: $e');
  }
}

在这个示例中,我们首先将一个JSON字符串解码为一个Dart映射,然后尝试使用User.fromJson工厂方法将其转换为一个User对象。如果JSON数据不符合UserSchema中定义的格式或类型要求,validate方法将抛出一个异常,我们可以在catch块中捕获并处理这个异常。

这就是如何在Flutter项目中使用strict_json插件进行严格JSON解析的一个完整示例。通过使用strict_json,你可以确保你的应用只处理符合预期格式和类型的JSON数据,从而提高应用的稳定性和安全性。

回到顶部