VB.Net 的 JSON 模式会导致集合的代码无法工作

问题描述 投票:0回答:1

以前从未使用过 Newtonsoft,我在这里阅读了很多帖子,发现生成模型对象应该很容易:使用众多在线工具之一将模式转换为 VB.net(或 C# 并转换)。我的尝试全部失败,其中还包括使用纯 C# 转换。这个问题与集合有关(我认为)或者可能只是架构文件本身。

原始架构有 3500 行,这是一个片段(它是 NDA,所以我不知道我可以发布多少)。这就在顶部附近,它是根对象定义的一部分:

"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 有一个名为“Properties”的结构,它是一个 Property 对象数组,其中有一个 Messages 集合(只是字符串),然后是一堆字段。查看输出 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

在众多问题中,它定义了两个类,称为Properties。此外,列表

items
不是Property对象的集合,而是对名为Items的新类的引用,该类是对Properties的引用,而Properties并不引用Property对象。这不是模式中
items
集合的唯一实例,尽管它们指向不同的底层对象,但它将它们全部转换为
Items

接下来,我尝试了使用 JSON2Csharp 制作 C# 版本的替代建议(现在这很有趣,它自动更正为“shart”!),然后进行转换。意识到两步过程不太可能开箱即用,因此我创建了一个新的 C# 项目并将结果放在那里。这也给了我很多台词,比如......

public Items items { get; set; }

但是这次它根本没有费心去创建一个 Items 类,所以这些只是错误。

好的,问题:

  1. 有人知道有一个工具可以正确处理这种 JSON 模式吗?我认为是 $ 或 # 混淆了它?我看到很多关于各种可下载工具的参考,但我在网上找不到它们。

  2. 如果做不到这一点,我怀疑我只需将各种项目引用转换为集合类型,但我对 NS 不熟悉,所以这些只是

    List(Of Property)
    还是在反序列化过程中需要其他类型?

c# json vb.net
1个回答
0
投票

谷歌未能找到任何有用的东西,但确实向我指出了 JSON 模式不一致。那里的一篇文章给出了该主题的答案:

corvus-dotnet/Corvus.JsonSchema

就我个人而言,我更喜欢使用在线工具,但是安装此工具后,它立即生成了一个工作对象模型,我肯定会推荐给大家。

对于那些想知道的人来说,使用模式文件的优点(除了我所拥有的)是它包含更多绝对有用的元数据......比如哪些字段是必需的,哪些字段是可选的,类型数组中的对象等。这些比使用实际的 JSON 文件更充实了对象模型。

© www.soinside.com 2019 - 2024. All rights reserved.