RFC 8259 (с 2017 года) требует, чтобы
Текст JSON, передаваемый между системами, которые не являются частью замкнутой экосистемы, ДОЛЖЕН быть закодирован с использованием UTF-8.
В старых RFC 7159 (с 2013 г.) и RFC 7158 (с 2013 г.) указано, что
текст JSON ДОЛЖЕН быть закодированв UTF-8, UTF-16 или UTF-32.Кодировка по умолчанию - UTF-8, а тексты JSON, которые кодируются в UTF-8, являются совместимыми в том смысле, что они будут успешно прочитаны максимальным числом реализаций;Есть много реализаций, которые не могут успешно читать тексты в других кодировках (таких как UTF-16 и UTF-32).
И RFC 4627 (с 2006 года, самая старая из тех, чтоЯ мог бы найти):
Текст JSON ДОЛЖЕН быть закодирован в Unicode.Кодировка по умолчанию - UTF-8.
Поскольку первые два символа текста JSON всегда будут символами ASCII, можно определить, является ли поток октетов UTF-8, UTF-16 (BE или LE) или UTF-32 (BE или LE), взглянув на шаблон нулей в первых четырех октетах.
JSONDecoder
(который использует JSONSerialization
под капотом) способен декодироватьUTF-8, UTF-16 и UTF-32, как с прямым порядком байтов, так и с прямым порядком байтов.Пример:
let data = "[1, 2, 3]".data(using: .utf16LittleEndian)!
print(data as NSData) // <5b003100 2c002000 32002c00 20003300 5d00>
let a = try! JSONDecoder().decode([Int].self, from: data)
print(a) // [1, 2, 3]
Поскольку допустимый текст JSON должен начинаться с "[" или "{", кодировка может быть однозначно определена из первых байтов данных.
Я сделалне найти это документированное , хотя, и, вероятно, не следует полагаться на это.Будущая реализация JSONDecoder
может поддерживать только новый стандарт и потребовать UTF-8.