Flutter安全JSON处理插件darty_json_safe的使用

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

Flutter安全JSON处理插件darty_json_safe的使用

为什么要开发这个库?

因为有一些场景直接通过 JSONObject 取值更加方便。比如下面的一串JSON字符串:

{"a":1,"b":2,"c":3}

如果按照系统自带的方式获取对应的值:

int? a = jsonObject['a'] as int?;

此时如果返回的数据变更如下:

{"a":'1',"b":'2',"c":'3'}

{"a":{},"b":{},"c":{}}

之前的代码就会报错。还有很多情况,系统的 JSONObject 是做不到的。我们看一下通过这个库可以干什么吧。

完整示例 Demo

直接从数组获取 Double 值
final value = JSON([1])[0].doubleValue;

/// 此时 value 是 1
从一组对象获取名字组成数组
final jsonText = '''
      [{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"},{"name":"SoSo","url":"http://www.SoSo.com"}]
      ''';
final json = JSON(jsonText);
final names = json.listValue.map((e) => JSON(e)['name'].stringValue).toList();

/// 此时 names 是 ['Google', 'Baidu', 'SoSo']
从字典获取对应的值
final jsonText = '''
      {"name":"Google","url":"http://www.google.com"}
      ''';
final name = JSON(jsonText)['name'].stringValue;

/// 此时 name 值 Google
根据路径获取对应的值
final jsonText = '''
[{"list":[{"name":"king"}]}]
''';
final keyPaths = [0, 'list', 0, 'name'];
final name = JSON(jsonText)[keyPaths].stringValue;
final name1 = JSON(jsonText)[0]['list'][0]['name'].stringValue;

/// 此时 name 和 name1 的值都是 king
类型转换
JSON(1).stringValue; /// '1'
JSON(1.1).stringValue; /// '1.1'
JSON(true).intValue; /// 1
JSON('1').stringValue; /// '1'
超出边界取值
final JSON json = JSON('[1,2,3]');
json[3].int; /// null
循环打印数组元素
final JSON json = JSON('[1,2,3]');
json.forEachList((index, e) {
    if (index == 0) {
        print(e.int); /// 1
    } else if (index == 1) {
        print(e.int); /// 2
    } else if (index == 2) {
        print(e.int); /// 3
    }
});
循环打印字典
final JSON json = JSON('{"a":1,"b":2,"c":3}');
json.forEachMap((key, e) {
    if (key == 'a') {
        print(e.int); /// 1
    } else if (key == 'b') {
        print(e.int); /// 2
    } else if (key == 'c') {
        print(e.int); /// 3
    }
});
字典值不存在
final JSON json = JSON('{"a":1,"b":2,"c":3}');
json['d'].int; /// null
设置字典的值
final JSON json = JSON('{"a":1,"b":2,"c":3}');
json['d'] = JSON(4);
print(json['d'].int); /// 4

json['d'] = JSON('5');
print(json['d'].int); /// '5'

json['d'] = 5;
print(json['d'].int); /// 5
获取对应的Key的值是否存在
final JSON json = JSON('{"a":1,"b":2,"c":3}');
print(json['a'].exists()); /// true
设置数组值超出边界
final JSON json = JSON('[1,2,3]');
json[0] = 100;
json[1] = 200;
json[2] = 300;
json[99999] = 400;
print(json); /// [100,200,300]
设置Key不在字典存在
final JSON json = JSON('{"a":1,"b":2,"c":3}');
json['d'] = 100;
print(json); /// {'a': 1, 'b': 2, 'c': 3, 'd': 100}
通过路径更新值
final jsonText = '''
{"list":[{"user":{"name":"value"}}]}
''';
final json = JSON(jsonText);
json['list'][0]['user']['name'] = 'new value';
print(json); /// {"list":[{"user":{"name":"new value"}}]}
直接通过Key数组更新值
final jsonText = '''
{"list":[{"user":{"name":"value"}}]}
''';
final json = JSON(jsonText);
json[['list', 0, 'user', 'name']] = 'new value';
print(json); /// {"list":[{"user":{"name":"new value"}}]}

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

1 回复

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


当然,以下是如何在Flutter项目中使用darty_json_safe插件来处理安全JSON的示例代码。darty_json_safe是一个旨在提供安全JSON解析和序列化的库,可以防止JSON注入攻击等安全问题。

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

dependencies:
  flutter:
    sdk: flutter
  darty_json_safe: ^最新版本号  # 请替换为实际最新版本号

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

接下来是一个使用darty_json_safe的简单示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Darty JSON Safe Example'),
        ),
        body: Center(
          child: SafeJsonExample(),
        ),
      ),
    );
  }
}

class SafeJsonExample extends StatefulWidget {
  @override
  _SafeJsonExampleState createState() => _SafeJsonExampleState();
}

class _SafeJsonExampleState extends State<SafeJsonExample> {
  String result = '';

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

  void _parseJson() async {
    // 示例JSON字符串,这里我们使用一个安全的JSON字符串
    String jsonString = '''
    {
      "name": "John Doe",
      "age": 30,
      "email": "john.doe@example.com"
    }
    ''';

    try {
      // 使用 DartyJsonSafe 解析 JSON
      final safeJson = DartyJsonSafe.parse(jsonString);

      // 访问解析后的数据
      final name = safeJson.getString('name');
      final age = safeJson.getInt('age');
      final email = safeJson.getString('email');

      // 更新UI
      setState(() {
        result = 'Name: $name\nAge: $age\nEmail: $email';
      });
    } catch (e) {
      // 处理解析错误
      setState(() {
        result = 'Error parsing JSON: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Text(result);
  }
}

在这个示例中,我们做了以下几件事:

  1. 添加依赖:在pubspec.yaml文件中添加了darty_json_safe依赖。
  2. 导入库:在代码文件中导入了darty_json_safe库。
  3. 解析JSON:使用DartyJsonSafe.parse方法解析一个示例JSON字符串。
  4. 访问数据:使用safeJson.getStringsafeJson.getInt等方法安全地访问解析后的JSON数据。
  5. 更新UI:将解析后的数据显示在屏幕上。

注意:darty_json_safe的具体API可能有所变化,请参考其官方文档以获取最新的使用方法和API参考。

这个示例展示了如何使用darty_json_safe进行安全的JSON处理,从而避免潜在的JSON注入攻击等安全问题。

回到顶部