Flutter JSON解析与验证插件json_schema的使用

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

Flutter JSON解析与验证插件 json_schema 的使用

json_schema 是一个平台无关(web、flutter 或 vm)的 Dart 库,用于根据 JSON Schema 验证 JSON 实例。它支持多版本的 JSON Schema 标准,最新支持 Draft 7。

简单示例用法

创建和验证简单的 JSON Schema

最简单的方式是通过传递 JSON 数据到 JsonSchema.create 方法来创建一个 schema。可以使用 JSON 字符串或解码后的 JSON 对象(Dart Mapbool)。

import 'package:json_schema/json_schema.dart';

void main() {
  // 定义一个简单的 schema,要求数据类型为整数
  final mustBeIntegerSchemaMap = {"type": "integer"};

  // 创建一些示例数据来进行验证
  final n = 3;
  final decimals = 3.14;
  final str = 'hi';

  // 构造 schema
  final schema = JsonSchema.create(mustBeIntegerSchemaMap);

  // 验证并打印结果
  print('$n => ${schema.validate(n)}'); // true
  print('$decimals => ${schema.validate(decimals)}'); // false
  print('$str => ${schema.validate(str)}'); // false
}

异步创建 JSON Schema

如果你有需要从远程 HTTP URI 获取的 $ref,你可以使用 JsonSchema.createAsync 方法:

import 'package:json_schema/json_schema.dart';
import 'package:http/http.dart' as http;

Future<void> main() async {
  // 定义一个带有 $ref 的 schema
  final schemaWithRef = {
    "\$schema": "http://json-schema.org/draft-07/schema#",
    "properties": {
      "name": {"\$ref": "http://example.com/name.json"}
    }
  };

  // 使用 createAsync 方法异步创建 schema
  final schema = await JsonSchema.createAsync(schemaWithRef, httpClient: http.Client());

  // 验证数据
  final instance = {"name": "John Doe"};
  print('Validation result: ${schema.validate(instance)}');
}

从 URL 或文件创建 JSON Schema

你也可以直接从公开可访问的 URL 或本地文件创建 JSON Schema。

从 URL 创建

import 'package:json_schema/json_schema.dart';
import 'package:http/http.dart' as http;

Future<void> main() async {
  final url = Uri.parse('http://example.com/schema.json');
  final client = http.Client();

  // 从 URL 创建 schema
  final schema = await JsonSchema.createFromUrl(url, httpClient: client);

  // 验证数据
  final instance = {"name": "John Doe", "age": 30};
  print('Validation result: ${schema.validate(instance)}');
}

从文件创建

import 'package:json_schema/json_schema.dart';
import 'dart:io';

Future<void> main() async {
  final file = File('path/to/your/schema.json');

  // 读取文件内容
  final content = await file.readAsString();
  final schemaMap = jsonDecode(content);

  // 创建 schema
  final schema = JsonSchema.create(schemaMap);

  // 验证数据
  final instance = {"name": "John Doe", "age": 30};
  print('Validation result: ${schema.validate(instance)}');
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用json_schema插件进行JSON解析与验证的示例代码。这个示例将展示如何定义一个JSON Schema,然后使用该插件来验证一个JSON对象是否符合该Schema。

首先,确保你的Flutter项目中已经添加了json_schema依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  json_schema: ^4.0.0  # 请检查最新版本号

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

接下来,我们编写一个Flutter应用来演示如何使用json_schema插件。

import 'package:flutter/material.dart';
import 'package:json_schema/json_schema.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter JSON Schema Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String schemaJson = '''
  {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
      "name": {
        "type": "string"
      },
      "age": {
        "type": "integer",
        "minimum": 0
      },
      "email": {
        "type": "string",
        "format": "email"
      }
    },
    "required": ["name", "age", "email"]
  }
  ''';

  final String jsonData = '''
  {
    "name": "John Doe",
    "age": 30,
    "email": "john.doe@example.com"
  }
  ''';

  String validationResult = '';

  @override
  void initState() {
    super.initState();
    validateJson();
  }

  void validateJson() async {
    try {
      var schema = await loadSchema(schemaJson);
      var data = jsonDecode(jsonData);
      var validator = Validator.fromSchema(schema);
      var report = validator.validate(data);

      if (report.isEmpty) {
        setState(() {
          validationResult = 'JSON is valid.';
        });
      } else {
        setState(() {
          validationResult = 'JSON is invalid:\n' + report.join('\n');
        });
      }
    } catch (e) {
      setState(() {
        validationResult = 'Error validating JSON: $e';
      });
    }
  }

  Future<Schema> loadSchema(String schemaJson) async {
    return Schema.fromJson(jsonDecode(schemaJson));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter JSON Schema Demo'),
      ),
      body: Center(
        child: Text(validationResult),
      ),
    );
  }
}

代码解释

  1. 依赖导入:导入flutterjson_schema包。
  2. 主应用:定义一个简单的Flutter应用,包含一个主页面MyHomePage
  3. Schema和数据:在MyHomePage类中定义了一个JSON Schema字符串和一个待验证的JSON数据字符串。
  4. 验证逻辑
    • 使用loadSchema函数将Schema字符串加载为Schema对象。
    • 使用jsonDecode将JSON数据字符串解析为Dart对象。
    • 使用Validator.fromSchema创建一个验证器,并使用validate方法验证数据。
    • 根据验证结果更新UI显示的信息。
  5. UI显示:在build方法中,使用ScaffoldCenter组件显示验证结果。

运行这个Flutter应用,你应该会看到显示“JSON is valid.”的页面,因为提供的JSON数据符合定义的Schema。如果你修改JSON数据以使其不符合Schema(例如,删除name字段或将age字段的值设置为负数),你将看到相应的验证错误信息。

回到顶部