dart:convert

用于在不同数据表示之间进行转换的编码和解码器,包括 JSON 和 UTF-8。

除了常用的数据表示转换器外,该库还提供了以易于链式使用和与流一起使用的方式实现转换器的支持。

要在您的代码中使用此库

import 'dart:convert';

两个常用的转换器是 JsonCodecUtf8Codec 顶级实例,分别命名为 jsonutf8

JSON

JSON 是一种用于表示结构化对象的简单文本格式和集合。

JsonCodec 将 JSON 对象编码为字符串,并将字符串解码为 JSON 对象。该 json 编码器/解码器使用 JSON 格式在字符串和对象结构(如列表和映射)之间转换。

jsonJsonCodec 的默认实现。

示例

var encoded = json.encode([1, 2, { "a": null }]);
var decoded = json.decode('["foo", { "bar": 499 }]');

有关更多信息,请参阅 JsonEncoderJsonDecoder

UTF-8

Utf8Codec 将字符串编码为 UTF-8 代码单元(字节),并将 UTF-8 代码单元解码为字符串。

utf8Utf8Codec 的默认实现。

示例

var encoded = utf8.encode('Îñţérñåţîöñåļîžåţîờñ');
var decoded = utf8.decode([
  195, 142, 195, 177, 197, 163, 195, 169, 114, 195, 177, 195, 165, 197,
  163, 195, 174, 195, 182, 195, 177, 195, 165, 196, 188, 195, 174, 197,
  190, 195, 165, 197, 163, 195, 174, 225, 187, 157, 195, 177]);

有关更多信息,请参阅 Utf8EncoderUtf8Decoder

ASCII

AsciiCodec 将字符串编码为以字节存储的 ASCII 代码,并将 ASCII 字节解码为字符串。并非所有字符都可以表示为 ASCII,因此并非所有字符串都可以成功转换。

asciiAsciiCodec 的默认实现。

示例

var encoded = ascii.encode('This is ASCII!');
var decoded = ascii.decode([0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
                            0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x21]);

有关更多信息,请参阅 AsciiEncoderAsciiDecoder

Latin-1

Latin1Codec 将字符串编码为 ISO Latin-1(又名 ISO-8859-1)字节,并将 Latin-1 字节解码为字符串。并非所有字符都可以表示为 Latin-1,因此并非所有字符串都可以成功转换。

latin1Latin1Codec 的默认实现。

示例

var encoded = latin1.encode('blåbærgrød');
var decoded = latin1.decode([0x62, 0x6c, 0xe5, 0x62, 0xe6,
                             0x72, 0x67, 0x72, 0xf8, 0x64]);

有关更多信息,请参阅 Latin1EncoderLatin1Decoder

Base64

Base64Codec 使用默认的 base64 字母表进行编码,使用 base64 和 base64url 字母表进行解码,不允许无效字符并且需要填充。

base64Base64Codec 的默认实现。

示例

var encoded = base64.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
                             0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
var decoded = base64.decode('YmzDpWLDpnJncsO4ZAo=');

有关更多信息,请参阅 Base64EncoderBase64Decoder

转换器

转换器通常与流一起使用,将随着数据的可用而通过流转换数据。以下代码使用了两个转换器。第一个是 UTF-8 解码器,它将从文件读取的数据从字节转换为 UTF-8,第二个是 LineSplitter 的一个实例,它将数据在换行边界处分割。

const showLineNumbers = true;
var lineNumber = 1;
var stream = File('quotes.txt').openRead();

stream.transform(utf8.decoder)
      .transform(const LineSplitter())
      .forEach((line) {
        if (showLineNumbers) {
          stdout.write('${lineNumber++} ');
        }
        stdout.writeln(line);
      });

有关创建自己的转换器的信息,请参阅 CodecConverter 类的文档。

HTML 转义

HtmlEscape 转换器转义在 HTML 中有特殊意义的字符。转换器找到在 HTML 源中具有重要意义的字符,并将它们替换为相应的 HTML 实体。

可以使用 HtmlEscapeMode.new 构造函数创建自定义转义模式。

示例

const htmlEscapeMode = HtmlEscapeMode(
  name: 'custom',
  escapeLtGt: true,
  escapeQuot: false,
  escapeApos: false,
  escapeSlash: false,
 );

const HtmlEscape htmlEscape = HtmlEscape(htmlEscapeMode);
String unescaped = 'Text & subject';
String escaped = htmlEscape.convert(unescaped);
print(escaped); // Text & subject

unescaped = '10 > 1 and 1 < 10';
escaped = htmlEscape.convert(unescaped);
print(escaped); // 10 &gt; 1 and 1 &lt; 10

unescaped = "Single-quoted: 'text'";
escaped = htmlEscape.convert(unescaped);
print(escaped); // Single-quoted: 'text'

unescaped = 'Double-quoted: "text"';
escaped = htmlEscape.convert(unescaped);
print(escaped); // Double-quoted: "text"

unescaped = 'Path: /system/';
escaped = htmlEscape.convert(unescaped);
print(escaped); // Path: /system/

AsciiCodec
AsciiCodec 允许将字符串编码为 ASCII 字节,并将 ASCII 字节解码为字符串。
AsciiDecoder
将 ASCII 字节转换为字符串。
AsciiEncoder
将只包含 ASCII 字符的字符串转换为字节。
Base64Codec
A base64 编码器和解码器。
Base64Decoder
base64 编码数据的解码器。
Base64Encoder
Base64 和 base64url 编码转换器。
ByteConversionSink
ByteConversionSink 为转换器提供了一个高效传输字节数据的接口。
ChunkedConversionSink<T>
在分块转换期间,ChunkedConversionSink 用于在两个转换器之间更有效地传输数据。
ClosableStringSink
ClosableStringSink 通过添加一个 close 方法扩展了 StringSink 接口。
Codec<S, T>
Codec 编码(如果受支持)并解码数据。
Converter<S, T>
Converter 将数据从一种表示转换为另一种表示。
编码
开放式的编码集。
HtmlEscape
将具有特殊意义的字符转义的转换器。
HtmlEscapeMode
HTML 转义模式。
JsonCodec
JsonCodec 将 JSON 对象编码为字符串,并将字符串解码为 JSON 对象。
JsonDecoder
这个类解析 JSON 字符串并构建相应的对象。
JsonEncoder
这个类将 JSON 对象转换为字符串。
JsonUtf8Encoder
将单个对象编码成一个 UTF-8 编码的 JSON 字符串的编码器。
Latin1Codec
Latin1Codec 将字符串编码为 ISO Latin-1(即 ISO-8859-1)字节,并解码 Latin-1 字节为字符串。
Latin1Decoder
这个类将 Latin-1 字节(无符号 8 位整数的列表)转换为字符串。
Latin1Encoder
这个类将只包含 ISO Latin-1 字符的字符串转换为字节。
LineSplitter
StreamTransformer,用于将字符串拆分为单独的行。
StringConversionSink
用于转换器高效传输字符串数据的接收器。
Utf8Codec
Utf8Codec 将字符串编码为 UTF-8 代码单元(字节),并将 UTF-8 代码单元解码为字符串。
Utf8Decoder
这个类将 UTF-8 代码单元(无符号 8 位整数的列表)转换为字符串。
Utf8Encoder
这个类将字符串转换为它们的 UTF-8 代码单元(无符号 8 位整数列表)。

常量

ascii → const AsciiCodec
默认 AsciiCodec 实现的实例。
base64 → const Base64Codec
A base64 编码器和解码器。
base64Url → const Base64Codec
A base64url 编码器和解码器。
htmlEscape → const HtmlEscape
一个将字符转换为HTML实体的String转换器。
json → const JsonCodec
默认实现的JsonCodec的一个实例。
latin1 → const Latin1Codec
默认实现的Latin1Codec的一个实例。
unicodeBomCharacterRune → const int
Unicode字节顺序标记(BOM)字符U+FEFF
unicodeReplacementCharacterRune → const int
Unicode替换字符U+FFFD(�)。
utf8 → const Utf8Codec
默认实现的Utf8Codec的一个实例。

函数

base64Decode(String source) Uint8List
解码base64base64url编码的字节。
base64Encode(List<int> bytes) String
使用base64编码对字节进行编码。
base64UrlEncode(List<int> bytes) String
使用base64url编码对字节进行编码。
jsonDecode(String source, {Object? reviver(Object? key, Object? value)?}) → dynamic
解析字符串并返回生成的Json对象。
jsonEncode(Object? object, {Object? toEncodable(Object? nonEncodable)?}) String
将对象转换为JSON字符串。

类型别名

ByteConversionSinkBase = ByteConversionSink
此类为需要接受字节输入的转换器提供了一个基类。
StringConversionSinkBase = StringConversionSink
此类为需要接受字符串输入的转换器提供了一个基类。
StringConversionSinkMixin = StringConversionSink
此类为需要接受字符串输入的转换器提供一个混入类。

异常 / 错误

JsonCyclicError
报告由于循环引用,对象无法被转换为字符串。
JsonUnsupportedObjectError
当对象无法序列化时,JSON序列化抛出的错误。