Схема JSON для VB.Net приводит к нерабочему коду для коллекций

Никогда раньше не работавший с 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, так что это просто ошибки.

ОК, вопросы:

  1. кто-нибудь знает инструмент, который правильно обрабатывает такую ​​схему JSON? Я предполагаю, что это $ или #, что сбивает с толку? Я видел много ссылок на различные загружаемые инструменты, но больше не могу найти ни одного из них в Интернете.

  2. в противном случае я подозреваю, что мне просто нужно преобразовать ссылки на различные элементы в тип коллекции, но я не знаком с NS, так что это просто List(Of Property) или во время десериализации он ожидает какой-то другой тип?

Вставьте свой JSON в QuickType, сначала выберите Attributes Only в селекторе Output Features. Вы увидите, что все свойства JSON украшены атрибутами, которые сопоставляют имя свойств JSON с именами, совместимыми с .NET/C#. Идите оттуда. Версия парсера Complete также включает код для некоторых базовых преобразователей, если они необходимы (иногда даже тогда, когда это не так :). Но это также может дать вам некоторые подсказки о том, как анализировать исходный JSON. Без фактической полной структуры предложить что-то значимое не так-то просто.

Jimi 25.04.2024 19:01

Я думаю, проблема в том, что «вставьте свой JSON»… У меня есть файл схемы JSON, а не сам JSON. Есть ли что-то, что преобразует файл схемы в макет класса?

Maury Markowitz 25.04.2024 19:37

Я это понимаю, но, как уже упоминалось, схема неполная, неясно, для чего вы собираетесь ее использовать и содержит ли она внешние ссылки (другие файлы). См. Загрузка схем и раздел Resolving externally referenced schemas. Планируете ли вы использовать схему для упреждающего создания структуры классов фактического JSON? Или в целях проверки?

Jimi 25.04.2024 19:57

Вы используете .NET или .NET Framework? Какая версия?

user246821 25.04.2024 22:02

Следующие материалы могут быть интересны: Как писать объекты .NET в формате JSON (сериализовать)

user246821 25.04.2024 22:02

Пробовали ли вы использовать Visual Studio для создания классов? В Visual Studio добавьте класс в свой проект, скопируйте JSON в буфер обмена (Ctrl-C), затем в меню Visual Studio выберите «Правка» => «Специальная вставка» => «Вставить JSON как классы».

user246821 26.04.2024 02:16

Пример JSON см. здесь.

user246821 26.04.2024 02:20

@ user246821 - опять же, у меня есть схема JSON, а не JSON. Эти инструменты работают только с JSON.

Maury Markowitz 26.04.2024 17:50

@Jimi - да, я хочу использовать файл схемы для создания классов модели. Здесь нет внешних ссылок или чего-то «странного», на самом деле это просто набор структур, содержащих числа, строки и указатели на другие структуры. В схеме перечислены все поля и их типы. Должно быть возможно использовать ее для создания классов модели, не так ли? Я что-то упускаю?

Maury Markowitz 26.04.2024 17:53

@ user246821 — схемы JSON написаны в формате JSON.

Maury Markowitz 26.04.2024 18:09

@MauryMarkowitz: Извините, моя ошибка.

user246821 26.04.2024 18:16

Вы можете попробовать поискать: create json from json schema. Если вы можете сгенерировать образец JSON, вы можете использовать Visual Studio для создания классов. Следующее может быть интересно: stackoverflow.com/a/38664260/10024425

user246821 26.04.2024 18:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Google, не сумев найти ничего полезного, указал мне на разногласия в схеме JSON. Сообщение там дает ответ на эту тему:

corvus-dotnet/Corvus.JsonSchema

Лично я бы предпочел использовать онлайн-инструмент, но, установив этот инструмент, он сразу создал рабочую объектную модель, и я определенно рекомендую ее всем.

Для тех из вас, кому интересно, преимущество использования файла схемы (кроме того, что это все, что у меня было) заключается в том, что он содержит гораздо больше метаданных, которые абсолютно полезны... например, какие поля являются обязательными, а какие необязательными, типы объекты в массиве и т. д. Они конкретизируют объектную модель гораздо больше, чем использование реального файла JSON.

Другие вопросы по теме