- System. Text. Json Пространство имен
- Классы
- Структуры
- Перечисления
- System.Text.Json.JsonReaderException не найден в пространстве имен
- 2 ответа
- Не удается загрузить сборки для стандартной библиотеки .Net (System.Text.Json)
- 3 ответа
- Как сериализировать и десериализировать (маршалирование и демаршалирование) JSON в .NET
- Пространства имен
- Как записать объекты .NET в формате JSON (сериализация)
- Пример сериализации
- Сериализация в UTF-8
- Поведение сериализации
- Как считать JSON как объекты .NET (десериализация)
- Десериализация из UTF-8
- Поведение десериализации
- Сериализация в форматированный JSON
- Включение полей
- Методы расширения HttpClient и HttpContent
System. Text. Json Пространство имен
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет высокопроизводительные, не требовательные к памяти и соответствующие стандартам возможности обработки JSON, включая сериализацию объектов в текст JSON и десериализацию текста JSON в объекты за счет встроенной поддержки UTF-8. Оно также предоставляет типы для чтения и записи текста JSON в кодировке UTF-8 и для создания модели DOM в памяти для произвольного доступа к элементам JSON в структурированном представлении данных.
Классы
Предоставляет механизм для проверки структурного содержимого значения JSON без автоматического создания экземпляров для значений данных.
Определяет пользовательский объект исключения, порождаемого при обнаружении недопустимого текста JSON, при превышении определенной максимальной глубины или несовместимости текста JSON с типом свойства объекта.
Определяет политику именования, используемую для преобразования строкового имени в другой формат, например Camel.
Предоставляет функциональные возможности сериализации объектов или типов значений в JSON и десериализации JSON в объекты или типы значений.
Предоставляет параметры для использования с JsonSerializer.
Предоставляет высокопроизводительный API для однонаправленной некэшированной записи текста JSON в кодировке UTF-8.
Структуры
Предоставляет пользователю возможность определить пользовательское поведение при анализе JSON для создания JsonDocument.
Представляет определенное значение JSON в JsonDocument.
Представляет перечислитель для содержимого массива JSON.
Представляет перечислитель для свойств объекта JSON.
Предоставляет методы для преобразования текста в кодировке UTF-8 или UTF-16 в форму, подходящую для JSON.
Представляет одно свойство объекта JSON.
Предоставляет пользователю возможность определить пользовательское поведение при чтении JSON.
Определяет непрозрачный тип, содержащий и сохраняющий все соответствующие сведения о состоянии, которые необходимо предоставить Utf8JsonReader для продолжения чтения после обработки неполных данных.
Разрешает пользователю определить пользовательское поведение при чтении JSON с помощью Utf8JsonWriter.
Предоставляет высокопроизводительный API для однонаправленного доступа только для чтения к тексту JSON в кодировке UTF-8.
Перечисления
Определяет, как структура Utf8JsonReader обрабатывает комментарии.
Задает параметры сериализации по умолчанию на основе сценариев, которые можно использовать для создания экземпляра JsonSerializerOptions.
Определяет различные токены JSON, составляющие текст JSON.
Источник
System.Text.Json.JsonReaderException не найден в пространстве имен
Я конвертирую проект .NET Framework 4.5 в .NET Core 3.1. В моих тестах использовался Newtonsoft.Json для проверки допустимости json, и теперь я хотел бы реализовать то же самое с помощью встроенного System.Text.Json. Кажется, что
Throws System.Text.Json.JsonReaderException , но я не могу уловить это, поскольку указание на это исключение приводит к ошибке
Тип или имя пространства имен «JsonReaderException» не существует в пространстве имен «System.Text.Json» (отсутствует ссылка на сборку?)
Я просто хотел бы понять, как это возможно, что что-то, что на самом деле, кажется, не существует, может быть брошено.
Обновление № 1: Stacktrace:
Обновление № 2: Я пошел посмотреть, будут ли какие-то нюгеты, которые мне не хватает. Я обнаружил, что System.Text.Json представляет собой nuget (хотя он уже был доступен, я успешно использовал System.Text.JsonSerializer в тестовом файле). Я добавил его, и теперь у меня возникает актуальная проблема: он недоступен из-за уровня защиты.
Однако это напрямую не решает, как я могу поймать это в Assert.Throws ?
2 ответа
Вы можете добавить Newtonsoft.Json.dll к ссылкам на ваш проект, чтобы решить вашу проблему.
Тот факт, что «nofollow noreferrer»> System.Text.Json.JsonReaderException в настоящее время internal указывает, что Microsoft может изменить или удалить этот тип в любое время, и пользователи System.Text.Json должны не зависит от продолжающегося существования этого класса в качестве подкласса общественности JsonException . Действительно, документация для Utf8JsonReader говорится только, что
Когда Utf8JsonReader обнаруживает недопустимый JSON, он генерирует JsonException с базовой информацией об ошибке, такой как номер строки и позиция байта в строке.
И комментарии к коду для JsonReaderException состояния:
Вместо этого подтвердите, что выброшенное исключение является JsonException , используя Is.InstanceOf ()
Если по какой-либо причине вы должны указать конкретный тип исключения, вы можете проверить полное имя типа исключения, воспользовавшись тем, что Assert.Throws() возвращает выброшенное исключение:
Или вы можете использовать механизм пользовательских ограничений NUnit и ввести FullTypeNameConstraint как следующее:
И тогда вы сможете сделать:
Но, честно говоря, я бы не рекомендовал это.
Кроме того, << X0>> является одноразовым и фактически должен быть утилизирован для освобождения объединенной памяти для повторного использования.
Источник
Не удается загрузить сборки для стандартной библиотеки .Net (System.Text.Json)
Я пишу библиотеку .Net Standard 2.0, которая будет использоваться двоичным модулем PowerShell. Библиотека будет в основном клиентом API с большим количеством классов для работы с ответами JSON. Прежде чем пытаться десериализовать строки, я подтвердил, что API предоставляет строку в кодировке JSON без проблем.
Поскольку он был совместим с .Net Стандартный 2.0 при использовании пакета NuGet, я подумал, что я бы попытался перейти на System.Text.Json, а не NewtonSoft. Тем не менее, он не имеет версии конкретных сборок, которая требуется для определенных платформ.
Мое окружение:
Windows 10
PowerShell 5.1 Desktop
.Net Framework 4.8
PowerShell Core 6.2.2
dotnet версия 3.0.100
На PowerShell Desktop возникают следующие проблемы, когда ему приходится десериализовать что-либо:
В PowerShell Core такое же исключение для другой сборки / файла.
Кто-нибудь получил какой-либо совет о том, как я могу решить эту проблему, не переходя на JSON-пакет Newtonsoft? Откат от System.Text.Json 4.7.1 до 4.7.0 или 4.6.0 приводит к проблемам с другими сборками, которые являются частью пакета NuGet для System.Text.Json. Я прочитал совет здесь, но я не могу применить его здесь, или я просто не понимаю.
Заранее спасибо. Пожалуйста, дайте мне знать, если вам потребуется дополнительная информация, я ее предоставлю.
ИЗМЕНИТЬ
Я обновил csproj как предложено Гоханом
Это сгенерировало следующий код в appName.dll.config
Таким образом, автогенерация всех перенаправлений связывания не работает, как упомянуто выше, есть по крайней мере еще два, которые не работают. Я бы попытался создать их вручную, но, насколько мне известно, сейчас нет исходного файла конфигурации, в который их можно было бы вставить. Если у кого-то есть какие-либо указания на это, я был бы признателен.
3 ответа
Проблема, с которой вы сталкиваетесь, заключается в том, что ваша библиотека нацелена на .NET Standard, который не является работоспособным фреймворком, поэтому иногда возникают проблемы при попытке загрузить его с использованием моделей, подобных модели Powershell. Позвольте мне попытаться объяснить немного больше, что происходит.
.NET Standard — это просто спецификация поверхности API, поэтому в основном это просто набор API, которые будут гарантированно присутствовать и иметь возможность работать на любой работающей платформе, которая реализует эту версию .NET Standard. Это означает, что если у вас есть библиотека, нацеленная на .NET Standard, нет реального способа опубликовать эту библиотеку со всеми ее зависимостями таким образом, чтобы гарантированно работать на любой работающей платформе, потому что каждая работающая среда может потребовать дополнительных зависимостей. чтобы ваша библиотека загружалась правильно. При обращении к библиотеке .NET Standard из консольного приложения (либо через ссылку на проект, либо через пакет NuGet) консольное приложение будет знать, на какую запускаемую платформу оно нацелено, поэтому оно сможет получить правильный набор зависимостей, который понадобится вашей библиотеке. во время выполнения, но проблема с вашим сценарием заключается в том, что это консольное приложение на самом деле не существует, поскольку вы загружаете его из PowerShell (который в некотором смысле является консольным приложением). Из-за всего этого, чтобы ваша библиотека успешно загружалась во время выполнения, вам нужно будет выполнить работу, которую будет выполнять консольное приложение, ссылающееся на вашу библиотеку, и выбрать правильные ссылки для переноса вашей библиотеки в зависимости от среды выполнения, которая будет загружая его. Для PowerShell существует две основных среды выполнения (.NET Core для ядра PowerShell и .NET Framework для Powershell).
Самый простой способ решить вашу проблему, это просто создать одно фиктивное консольное приложение: из командной строки просто запустите dotnet new console -n dummyConsoleApp , установите для targetframework значение netcoreapp2.0 (если вы работаете на ядре powershell, если вы вместо этого работает на полную мощность, затем установите его net46 ). Затем добавьте ссылку на проект в вашу библиотеку, например
\File.csproj»/> , а затем запустите из командной строки dotnet publish -r win-x64 , которая должна создать в вашей папке bin каталог публикации, в котором будут все сборки, которые ваше приложение будет использовать во время выполнения. , После этого попробуйте снова загрузить файл File.dll, но на этот раз из этой папки публикации, и на этот раз у вас все получится, поскольку эта папка публикации будет иметь все необходимые зависимости, необходимые для среды выполнения, в которой работает powershell. Если по какой-либо причине это не работает для вас, пожалуйста, не стесняйтесь регистрировать проблему по этому вопросу в https: // github.com/dotnet/runtime сделайте репозиторий и отметьте меня (@joperezr), и я с радостью помогу вам диагностировать и устранить проблему.
Если вы не можете найти причину конфликта версий для библиотеки DLL System.Buffers , я думаю, вы можете использовать assemblybinding в своем конфигурационном файле, чтобы использовать версию 4.0.3.0 вместо 4.0.2.0
Если у вас есть другие конфликты версий, удалите все теги dependentassembly в файле конфигурации (включая приведенный выше) и добавьте их в файл проекта (.csproj):
При сборке проекта вы увидите файл (WebAppName) .dll.config в папке выходного лотка. Скопируйте все assemblybindings оттуда в исходный файл конфигурации. Затем удалите указанную выше часть кода из файла проекта.
Откройте ваше решение в Visual Studio. Проверьте вашу ссылку на все библиотеки. У вас есть дубликат dll, один из Bin, а другой из пакета самородков? Если у вас Visual Studio 2017 версии 15.7 или новее, вы можете легко отключить автоматически создаваемые перенаправления привязки на страницах свойств проекта.
Щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Свойства».
На странице приложения снимите флажок Автоматически создавать перенаправления привязки.
Нажмите Ctrl + S, чтобы сохранить изменения. Попробуйте построить это. Убедитесь, что вы ссылаетесь на все Dll из слепка, а ничего не находится в папке bin. Если он собирается, вы можете пойти иначе, сделайте обязательную переадресацию компиляции снова.
Источник
Как сериализировать и десериализировать (маршалирование и демаршалирование) JSON в .NET
Эта статья содержит сведения об использовании пространства имен System.Text.Json для сериализации и десериализации в нотации объектов JavaScript (JSON) и из нее. Если вы переносите существующий код из Newtonsoft.Json , ознакомьтесь со статьей Переход с Newtonsoft.Json на System.Text.Json System.Text.Json .
В направлениях и образце кода библиотека используется напрямую, а не с помощью платформы, например ASP.NET Core.
Большая часть примера кода сериализации устанавливает для параметра JsonSerializerOptions.WriteIndented значение true для структурирования JSON (с отступами и пробелами для удобства чтения). При использовании в рабочей среде для этого параметра обычно принимается значение по умолчанию false .
Примеры кода относятся к следующему классу и его вариантам:
Пространства имен
Пространство имен System.Text.Json содержит все точки входа и основные типы. Пространство имен System.Text.Json.Serialization содержит атрибуты и интерфейсы API для сложных сценариев и настройки, характерной для сериализации и десериализации. В примерах кода, приведенных в этой статье, для одного или обоих пространств имен необходимо добавить директивы using :
Атрибуты из пространства имен System.Runtime.Serialization не поддерживаются в System.Text.Json .
Как записать объекты .NET в формате JSON (сериализация)
Чтобы записать JSON в строку или в файл, вызовите метод JsonSerializer.Serialize.
В следующем примере показано создание JSON в виде строки:
В примере ниже для создания JSON-файла используется синхронный код:
В следующем примере для создания JSON-файла используется асинхронный код:
В предыдущих примерах для сериализуемого типа используется определение типа. Перегрузка Serialize() принимает параметр универсального типа:
Пример сериализации
Ниже приведен пример класса, который содержит свойства типа коллекции и определяемый пользователем тип:
POCO означает традиционный объект среды CLR. POCO — это тип .NET, который не зависит от каких-либо типов платформы, например посредством наследования или атрибутов.
Выходные данные JSON из сериализации экземпляра предыдущего типа выглядят следующим образом. По умолчанию выходные данные JSON сокращены (удалены пробелы, отступы и символы новой строки):
В следующем примере показан тот же объект JSON, но с форматированием (т. е. структурированный с пробелами и отступами):
Сериализация в UTF-8
Чтобы выполнить сериализацию в UTF-8, вызовите метод JsonSerializer.SerializeToUtf8Bytes:
Также доступна перегрузка Serialize, которая принимает Utf8JsonWriter.
Сериализация в UTF-8 происходит примерно на 5-10 % быстрее, чем при использовании строковых методов. Разница заключается в том, что байты (например, UTF-8) не нужно преобразовывать в строки (UTF-16).
Поведение сериализации
- По умолчанию все открытые свойства сериализуются. Вы можете указать свойства, которые нужно игнорировать.
- Кодировщик по умолчанию экранирует символы, не относящиеся к ASCII, символы, учитывающие HTML, в пределах диапазона ASCII и символы, которые должны быть экранированы в соответствии со спецификацией JSON RFC 8259.
- По умолчанию JSON сокращается. Вы можете структурировать JSON.
- По умолчанию регистр имен JSON соответствует именам в .NET. Вы можете настроить регистр имен JSON.
- По умолчанию обнаруживаются циклические ссылки и создаются исключения. Вы можете сохранять ссылки и обрабатывать циклические ссылки.
- По умолчанию поля игнорируются. Вы можете включить поля.
При косвенном использовании System.Text.Json в приложении ASP.NET Core некоторые поведения по умолчанию отличаются. Дополнительные сведения см. в разделе Стандартные параметры веб-приложений для JsonSerializerOptions.
- По умолчанию все открытые свойства сериализуются. Вы можете указать свойства, которые нужно игнорировать.
- Кодировщик по умолчанию экранирует символы, не относящиеся к ASCII, символы, учитывающие HTML, в пределах диапазона ASCII и символы, которые должны быть экранированы в соответствии со спецификацией JSON RFC 8259.
- По умолчанию JSON сокращается. Вы можете структурировать JSON.
- По умолчанию регистр имен JSON соответствует именам в .NET. Вы можете настроить регистр имен JSON.
- Обнаруживаются циклические ссылки и создаются исключения.
- Поля игнорируются.
К поддерживаемым типам относятся:
- Примитивы .NET, которые сопоставляются с примитивами JavaScript, например числовыми типами, строками и логическими значениями.
- Определяемые пользователем объекты POCO (традиционные объекты среды CLR).
- Одномерные массивы и массивы массивов ( T[][] ).
- Коллекции и словари из следующих пространств имен.
- System.Collections
- System.Collections.Generic
- System.Collections.Immutable
- System.Collections.Concurrent
- System.Collections.Specialized
- System.Collections.ObjectModel
- Примитивы .NET, которые сопоставляются с примитивами JavaScript, например числовыми типами, строками и логическими значениями.
- Определяемые пользователем объекты POCO (традиционные объекты среды CLR).
- Одномерные массивы и массивы массивов ( ArrayName[][] ).
- Dictionary где TValue — это object , JsonElement или POCO.
- Коллекции из следующих пространств имен.
- System.Collections
- System.Collections.Generic
- System.Collections.Immutable
- System.Collections.Concurrent
- System.Collections.Specialized
- System.Collections.ObjectModel
Для обработки дополнительных типов или для обеспечения функциональности, которая не поддерживается встроенными преобразователями, можно реализовать пользовательские преобразователи.
Как считать JSON как объекты .NET (десериализация)
Чтобы выполнить десериализацию из строки или файла, вызовите метод JsonSerializer.Deserialize.
В следующем примере показано считывание JSON из строки и создание экземпляра класса WeatherForecastWithPOCOs , показанного ранее для примера сериализации:
Чтобы выполнить десериализацию из файла с помощью синхронного кода, выполните считывание файла в строку, как показано в следующем примере:
Чтобы выполнить десериализацию из файла с помощью асинхронного кода, вызовите метод DeserializeAsync:
Десериализация из UTF-8
Для десериализации из UTF-8 вызовите перегрузку JsonSerializer.Deserialize, которая принимает значения ReadOnlySpan или Utf8JsonReader , как показано в следующих примерах. В примерах предполагается, что JSON находится в массиве байтов jsonUtf8Bytes.
Поведение десериализации
При десериализации JSON применяются следующие правила поведения:
- По умолчанию при сопоставлении имен свойств учитывается регистр. Вы можете указать учет регистра.
- Если JSON содержит значение для свойства, доступного только для чтения, значение игнорируется, а исключение не создается.
- Сериализатор не учитывает конструкторы, которые не являются открытыми.
- Поддерживается десериализация в неизменяемые объекты или свойства «только для чтения». См. статью Неизменяемые типы и записи.
- По умолчанию перечисления поддерживаются в виде чисел. Вы можете сериализовать имена перечислений в качестве строк.
- По умолчанию поля игнорируются. Вы можете включить поля.
- По умолчанию комментарии или завершающие запятые в JSON вызывают исключения. Вы можете разрешить комментарии и завершающие запятые.
- Максимальная глубина по умолчанию равна 64.
При косвенном использовании System.Text.Json в приложении ASP.NET Core некоторые поведения по умолчанию отличаются. Дополнительные сведения см. в разделе Стандартные параметры веб-приложений для JsonSerializerOptions.
- По умолчанию при сопоставлении имен свойств учитывается регистр. Вы можете указать учет регистра. Приложения ASP.NET Core указывают учет регистра по умолчанию.
- Если JSON содержит значение для свойства, доступного только для чтения, значение игнорируется, а исключение не создается.
- Для десериализации используется конструктор без параметров, который может быть общедоступным, внутренним или частным.
- Десериализация в неизменяемые объекты или свойства только для чтения не поддерживается.
- По умолчанию перечисления поддерживаются в виде чисел. Вы можете сериализовать имена перечислений в качестве строк.
- Поля не поддерживаются.
- По умолчанию комментарии или завершающие запятые в JSON вызывают исключения. Вы можете разрешить комментарии и завершающие запятые.
- Максимальная глубина по умолчанию равна 64.
При косвенном использовании System.Text.Json в приложении ASP.NET Core некоторые поведения по умолчанию отличаются. Дополнительные сведения см. в разделе Стандартные параметры веб-приложений для JsonSerializerOptions.
Для обеспечения функциональности, которая не поддерживается встроенными преобразователями, можно реализовать пользовательские преобразователи.
Сериализация в форматированный JSON
Чтобы структурировать выходные данные JSON, задайте для JsonSerializerOptions.WriteIndented значение true .
Ниже приведен пример типа для сериализации и структурирования данных JSON:
При многократном использовании JsonSerializerOptions с одинаковыми параметрами не создавайте новый экземпляр JsonSerializerOptions при каждом использовании. Повторно используйте один и тот же экземпляр для каждого вызова. Дополнительные сведения см. в разделе Повторное использование экземпляров JsonSerializerOptions.
Включение полей
Используйте глобальный параметр JsonSerializerOptions.IncludeFields или атрибут [JsonInclude] для включения поля при сериализации или десериализации, как показано ниже:
Чтобы пропустить поля, предназначенные только для чтения, используйте глобальный параметр JsonSerializerOptions.IgnoreReadOnlyFields.
Поля не поддерживаются в System.Text.Json в .NET Core 3.1. Эта функция может быть предоставлена пользовательскими преобразователями.
Методы расширения HttpClient и HttpContent
Сериализация и десериализация полезных данных JSON из сети являются обычными операциями. Методы расширения в HttpClient и HttpContent позволяют выполнять эти операции в одной строке кода. Эти методы расширения используют стандартные параметры веб-приложений для JsonSerializerOptions.
Источник