Flutter处理大整数JSON数据插件json_bigint的使用

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

Flutter处理大整数JSON数据插件json_bigint的使用

本插件提供方法用于将JSON字符串编码和解码为Dart映射,并且自带对BigInt的支持。

使用

以下示例将使用以下通用代码:

import 'package:json_bigint/json_bigint.dart';

String json = '''{
          "sometext": "hello world!",
          "bignumber": 999999999999999999,
          "expnumber": 2e3
        }''';

void printObj(String key, Object? val) => 
    print("$key is of type ${val.runtimeType} and has value: $val.");

解码

以下是解码方法的工作示例:

print("Decoding:");
print("------------------------");
var jsonMap = decodeJson(json) as Map<String, Object?>;
printObj("sometext", jsonMap["sometext"]);
printObj("bignumber", jsonMap["bignumber"]);
printObj("expnumber", jsonMap["expnumber"]);

print("\nDecoding w/ settings:");
print("------------------------");
var decSettings = DecoderSettings(
  treatExpAsIntWhenPossible: true,
);
var jsonMap2 = decodeJson(
  json,
  settings: decSettings,
) as Map<String, Object?>;
printObj("bignumber", jsonMap2["bignumber"]);
printObj("expnumber", jsonMap2["expnumber"]);

输出结果:

Decoding:
------------------------
sometext is of type String and has value: hello world!.
bignumber is of type _BigIntImpl and has value: 999999999999999999.
expnumber is of type double and has value: 2000.0.

Decoding w/ settings:
------------------------
bignumber is of type int and has value: 999999999999999999.
expnumber is of type int and has value: 2000.

解码设置

如果您想更改某些数字如何被解释为整数,可以传递一个DecoderSettings对象。它具有以下参数:

  • whetherUseInt: 控制是否在可能的情况下使用int而不是BigInt
    • 默认情况下,它使用BigInt.isValidInt来判断是使用int还是BigInt
    • 如果您希望所有数字都被解释为BigInt,则可以使用类似(_) => false的设置。
    • 如果您的项目同时针对原生和Web平台,则建议自行控制(例如,使用(v) => v <= BigInt.parse('9007199254740991'))。
print("\nDecoding w/ settings:");
print("------------------------");
var decSettings = DecoderSettings(treatExpAsIntWhenPossible: true);
var jsonMap2 = decodeJson(
  json,
  settings: decSettings,
) as Map<String, Object?>;
printObj("bignumber", jsonMap2["bignumber"]);
printObj("expnumber", jsonMap2["expnumber"]);

输出结果:

Decoding w/ settings:
------------------------
bignumber is of type int and has value: 999999999999999999.
expnumber is of type int and has value: 2000.

编码

以下是编码方法的工作示例:

print("\nEncoding:");
print("------------------------");
String jsonNew = encodeJson(jsonMap);
print(jsonNew);

输出结果:

Encoding:
------------------------
{"sometext":"hello world!","bignumber":999999999999999999,"expnumber":2000.0}

编码设置

如果您想格式化编码后的JSON,可以使用EncoderSettings对象。它具有以下参数:

  • indent: 每个JSON级别的缩进量。通常应为一些连续的空格或制表符字符。如果使用默认值(即空字符串),则不会在JSON中添加新行。
  • singleLineLimit: 在其元素被缩进之前,映射/列表可以有多长。如果使用默认值(即null),则所有元素都将始终被缩进。
  • afterKeyIndent: 在映射中的键和值之间进行缩进的数量。默认为空字符串。
print("\nEncoding w/ Settings:");
print("------------------------");
final encSettings = EncoderSettings(
  indent: "  ",
  singleLineLimit: 30,
  afterKeyIndent: " ",
);
String jsonFormatted = encodeJson(jsonMap2, settings: encSettings);
print(jsonFormatted);

输出结果:

Encoding w/ Settings:
------------------------
{
  "sometext": "hello world!",
  "bignumber": 999999999999999999,
  "expnumber": 2000
}

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

1 回复

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


在处理Flutter应用中的大整数JSON数据时,json_bigint 插件非常有用,因为它能够正确解析超过JavaScript安全整数范围(即 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER)的整数。以下是如何在Flutter项目中使用 json_bigint 插件的一个示例。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  json_bigint: ^^最新版本号^ # 请替换为当前最新版本号

然后运行 flutter pub get 来获取依赖。

步骤 2: 使用 json_bigint 解析 JSON

下面是一个完整的示例,展示如何使用 json_bigint 来解析包含大整数的JSON数据。

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:json_bigint/json_bigint.dart';

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

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

class BigIntJsonExample extends StatefulWidget {
  @override
  _BigIntJsonExampleState createState() => _BigIntJsonExampleState();
}

class _BigIntJsonExampleState extends State<BigIntJsonExample> {
  String result = '';

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

  void _parseJson() async {
    // 示例JSON数据,包含一个大整数
    String jsonString = '''
    {
      "id": 9223372036854775807,
      "name": "Example",
      "value": 123456789012345678901234567890
    }
    ''';

    // 使用 JsonBigIntDecoder 替代标准的 JsonDecoder
    final JsonBigIntDecoder decoder = JsonBigIntDecoder();
    Map<String, dynamic> data = decoder.convert(jsonString);

    // 访问解析后的数据
    BigInt id = data['id'] as BigInt;
    String name = data['name'] as String;
    BigInt value = data['value'] as BigInt;

    // 更新UI
    setState(() {
      result = 'ID: $id\nName: $name\nValue: $value';
    });
  }

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

解释

  1. 依赖添加:在 pubspec.yaml 中添加 json_bigint 依赖。
  2. 导入包:在 Dart 文件中导入 package:json_bigint/json_bigint.dart
  3. 解析 JSON:使用 JsonBigIntDecoder 替代标准的 jsonDecode 方法来解析 JSON 数据。JsonBigIntDecoder 会自动将大整数解析为 BigInt 类型,而不是 JavaScript 的 num 类型,从而避免溢出问题。
  4. 显示结果:将解析后的数据显示在屏幕上。

这个示例展示了如何在Flutter应用中处理包含大整数的JSON数据,并确保它们被正确解析和显示。

回到顶部