Никогда раньше не работавший с Newtonsoft, я прочитал здесь множество тем и обнаружил, что создание объекта модели должно быть простым: используйте один из многих онлайн-инструментов для преобразования схемы в VB.net (или C# и конвертируйте). Все мои попытки сделать это потерпели неудачу, включая использование чистого преобразования C#. Проблема связана с коллекциями (я думаю) или, возможно, просто с самим файлом схемы.
Исходная схема — 3500 строк, вот фрагмент (соглашение о неразглашении, поэтому я не знаю, сколько можно опубликовать). Это прямо вверху, это часть определения корневого объекта:
"properties": {
"Properties": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/definitions/Property"
}
}
Далее в коде приводится определение объекта Property, который по сути представляет собой просто набор строк:
"Property": {
"type": "object",
"required": [
"Name",
"Location",
"ID",
"ObjectType"
],
"properties": {
"Messages": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"$ref": "#/definitions/Message"
}
},
"Name": {
"$ref": "#/definitions/$basicType/definitions/requiredString"
},
"Location": {
"$ref": "#/definitions/$basicType/definitions/requiredString"
},
... more of same...
Я прочитал это, поскольку корневой JSON имеет структуру под названием «Свойства», которая представляет собой массив объектов Property, который имеет коллекцию сообщений (которые представляют собой просто строки), а затем кучу полей. Глядя на образец выходного файла JSON, я вижу в коллекции один объект (как и ожидалось):
"Properties":[{"ID":"33...
Сначала я попробовал jsonutils.com, так как там есть прямой JSON->VB. Это произвело это:
Public Class Items
Public Property $ref As String
End Class
Public Class Properties
Public Property type As String
Public Property minItems As Integer
Public Property uniqueItems As Boolean
Public Property items As Items
End Class
Public Class Properties
Public Property Version As Version
Public Property Messages As Messages
Public Property Properties As Properties
End Class
....
Public Class Property
Public Property type As String
Public Property required As String()
Public Property properties As Properties
End Class
Среди множества проблем были определены два класса, называемые Свойства. Более того, список items
— это не набор объектов Property, а ссылка на новый класс Items, который является ссылкой на Properties, который не ссылается на объекты Property. Это не единственный экземпляр коллекции items
в схеме, и она преобразует их все в Items
, несмотря на то, что они указывают на разные базовые объекты.
Затем я попробовал альтернативное предложение: создать версию C# с использованием JSON2Csharp (ЭТО забавно, она автоматически исправилась на «shart»!), а затем преобразовать ее. Понимая, что двухэтапный процесс вряд ли будет работать «из коробки», я вместо этого создал новый проект на C# и поместил туда результаты. Это тоже дало мне много строк вроде...
public Items items { get; set; }
Но в этот раз вообще не удосужились сделать класс Items, так что это просто ошибки.
ОК, вопросы:
кто-нибудь знает инструмент, который правильно обрабатывает такую схему JSON? Я предполагаю, что это $ или #, что сбивает с толку? Я видел много ссылок на различные загружаемые инструменты, но больше не могу найти ни одного из них в Интернете.
в противном случае я подозреваю, что мне просто нужно преобразовать ссылки на различные элементы в тип коллекции, но я не знаком с NS, так что это просто List(Of Property)
или во время десериализации он ожидает какой-то другой тип?
Я думаю, проблема в том, что «вставьте свой JSON»… У меня есть файл схемы JSON, а не сам JSON. Есть ли что-то, что преобразует файл схемы в макет класса?
Я это понимаю, но, как уже упоминалось, схема неполная, неясно, для чего вы собираетесь ее использовать и содержит ли она внешние ссылки (другие файлы). См. Загрузка схем и раздел Resolving externally referenced schemas
. Планируете ли вы использовать схему для упреждающего создания структуры классов фактического JSON? Или в целях проверки?
Вы используете .NET или .NET Framework? Какая версия?
Следующие материалы могут быть интересны: Как писать объекты .NET в формате JSON (сериализовать)
Приведите минимальный воспроизводимый пример , который другие смогут использовать, чтобы воссоздать проблему, с которой вы столкнулись. Обязательно включите действительный (т. е. полный) JSON, а не фрагменты. JSON должен представлять JSON, с которым вы работаете, и быть действительным. Используйте онлайн-валидатор, например JSON Beautify, чтобы проверить свой JSON перед его публикацией.
Пробовали ли вы использовать Visual Studio для создания классов? В Visual Studio добавьте класс в свой проект, скопируйте JSON в буфер обмена (Ctrl-C), затем в меню Visual Studio выберите «Правка» => «Специальная вставка» => «Вставить JSON как классы».
Пример JSON см. здесь.
@ user246821 - опять же, у меня есть схема JSON, а не JSON. Эти инструменты работают только с JSON.
@Jimi - да, я хочу использовать файл схемы для создания классов модели. Здесь нет внешних ссылок или чего-то «странного», на самом деле это просто набор структур, содержащих числа, строки и указатели на другие структуры. В схеме перечислены все поля и их типы. Должно быть возможно использовать ее для создания классов модели, не так ли? Я что-то упускаю?
@ user246821 — схемы JSON написаны в формате JSON.
@MauryMarkowitz: Извините, моя ошибка.
Вы можете попробовать поискать: create json from json schema
. Если вы можете сгенерировать образец JSON, вы можете использовать Visual Studio для создания классов. Следующее может быть интересно: stackoverflow.com/a/38664260/10024425
Google, не сумев найти ничего полезного, указал мне на разногласия в схеме JSON. Сообщение там дает ответ на эту тему:
corvus-dotnet/Corvus.JsonSchema
Лично я бы предпочел использовать онлайн-инструмент, но, установив этот инструмент, он сразу создал рабочую объектную модель, и я определенно рекомендую ее всем.
Для тех из вас, кому интересно, преимущество использования файла схемы (кроме того, что это все, что у меня было) заключается в том, что он содержит гораздо больше метаданных, которые абсолютно полезны... например, какие поля являются обязательными, а какие необязательными, типы объекты в массиве и т. д. Они конкретизируют объектную модель гораздо больше, чем использование реального файла JSON.
Вставьте свой JSON в QuickType, сначала выберите
Attributes Only
в селектореOutput Features
. Вы увидите, что все свойства JSON украшены атрибутами, которые сопоставляют имя свойств JSON с именами, совместимыми с .NET/C#. Идите оттуда. Версия парсераComplete
также включает код для некоторых базовых преобразователей, если они необходимы (иногда даже тогда, когда это не так :). Но это также может дать вам некоторые подсказки о том, как анализировать исходный JSON. Без фактической полной структуры предложить что-то значимое не так-то просто.