Вложенный список в файле YAML - возникли проблемы с созданием класса в VB.net (накануне онлайн SDE) - PullRequest
0 голосов
/ 06 ноября 2018

Я довольно плохо знаком с форматом YAML и VB.net в целом (работал с VB6 в течение ~ 5 лет на работе и после миграции, этот проект является небольшим обучающим упражнением). Я также использую пакет yamldotnet.

В данный момент я изменяю некоторый код, который был опубликован для анализа файла .yaml из Eve Online SDE, поскольку SDE добавил новые поля в файл yaml. В идеале я хотел бы использовать этот файл для выполнения вызовов API, чтобы получить статическую информацию из файлов SDE.

Я застреваю, добавляя свойства к «временному» классу для поля «masteries». Я отредактировал en / de / fr / etc. описания для удобства чтения.

582:
capacity: 270.0
description:
    de: info
    en: info
    fr: info
    ja: info
    ru: info
    zh: info
factionID: 500001
graphicID: 38
groupID: 25
marketGroupID: 61
mass: 1480000.0
masteries:
    0:
    - 96
    - 139
    - 85
    - 87
    - 94
    1:
    - 96
    - 139
    - 85
    - 87
    - 94
    2:
    - 96
    - 139
    - 85
    - 87
    - 94
    3:
    - 96
    - 139
    - 85
    - 87
    - 94
    4:
    - 96
    - 139
    - 85
    - 118
    - 87
    - 94
name:
    de: Bantam
    en: Bantam
    fr: Bantam
    ja: バンタム
    ru: Bantam
    zh: 矮脚鸡级
portionSize: 1
published: true
raceID: 1
radius: 27.0
sofFactionName: caldaribase
soundID: 20070
traits:
    roleBonuses:
    -   bonus: 300
        bonusText:
            de: info
            en: info
            fr: info
            ja: info
            ru: info
            zh: info
        importance: 1
        unitID: 105
    types:
        3330:
        -   bonus: 10
            bonusText:
                de: info
                en: info
                fr: info
                ja: info
                ru: info
                zh: info
            importance: 1
            unitID: 105
        -   bonus: 10
            bonusText:
                de: info
                en: info
                fr: info
                ja: info
                ru: info
                zh: info
            importance: 2
            unitID: 105
volume: 20000.0

И у меня есть класс, поскольку я добавляю свойства как

Class YAMLtempItem
    Public Property basePrice As Decimal?
    Public Property description As Dictionary(Of String, String)
    Public Property groupID As Integer
    Public Property iconID As Integer?
    Public Property marketGroupID As Integer?
    Public Property mass As String
    Public Property name As Dictionary(Of String, String)
    Public Property portionSize As Integer
    Public Property published As Boolean
    Public Property volume As Decimal?
    Public Property radius As Double?
    Public Property graphicID As Integer?
    Public Property soundID As Integer?
    Public Property raceID As Integer?
    Public Property sofFactionName As String
    Public Property capacity As String
    Public Property factionID As Integer?
    Public Property masteries As Dictionary(Of List(Of Integer), Integer)
End Class

и код, вызывающий синтаксический анализ, выглядит следующим образом. На данный момент он просто нажимает кнопку, чтобы запустить процесс синтаксического анализа, поскольку в итоге это будет модуль для добавления в более крупное приложение.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Dim input = New StringReader("C:\....\typeIDs.yaml")
    Dim input = System.IO.File.ReadAllText("C:\Users\ahooks\Dropbox\Eve VB.net Projects\EVE Resources\Static Data YAML\typeIDs.yaml")
    TextBox3.Text = ""

    Dim deserializer = New Deserializer()
    Dim strtemp = New StringReader(input)
    Dim itemTypes = deserializer.Deserialize(Of Dictionary(Of Integer, YAMLtempItem))(strtemp)
End Sub

Я пробовал разные комбинации для свойства 'masteries', но безрезультатно. Я также попытался найти что-то похожее на JSONUtils, которое сгенерирует класс из некоторых данных, но этого тоже не хватало. Кто-нибудь может указать мне правильное направление для получения этого вложенного списка?

1 Ответ

0 голосов
/ 06 ноября 2018

Кажется, что объявление свойства masteries ошибочно. Вы объявляете ключи списками целых чисел, а значения - целыми числами, в то время как документ содержит целые числа в качестве ключей и списки в качестве значений. Так что вместо

Public Property masteries As Dictionary(Of List(Of Integer), Integer)

Вы, вероятно, хотите

Public Property masteries As Dictionary(Integer, Of List(Of Integer))

Кроме того, YamlDotNet предполагает, что ваш код соответствует стандартным соглашениям об именах .NET, и по умолчанию предполагает использование camelCase в документе YAML. Это означает, что имена ваших свойств должны быть написаны заглавными буквами:

Class YAMLtempItem
    Public Property BasePrice As Decimal?
    Public Property Description As Dictionary(Of String, String)
    Public Property GroupID As Integer
    Public Property IconID As Integer?
    Public Property MarketGroupID As Integer?
    Public Property Mass As String
    Public Property Name As Dictionary(Of String, String)
    Public Property PortionSize As Integer
    Public Property Published As Boolean
    Public Property Volume As Decimal?
    Public Property Radius As Double?
    Public Property GraphicID As Integer?
    Public Property SoundID As Integer?
    Public Property RaceID As Integer?
    Public Property SofFactionName As String
    Public Property Capacity As String
    Public Property FactionID As Integer?
    Public Property Masteries As Dictionary(Of List(Of Integer), Integer)
End Class
...