S4753 Ответов: 1

Создание JSON с помощью VB.NET и еще json.net в приложении windows


Попробуйте создать файл JSON с помощью vb.net и еще json.net в приложении windows, но не удалось сгенерировать нужный формат файла JSON.

формат JSON:
{
  "CompCode": "COMP0001",
  "fp": "072018",
  "gt": 0,
  "cur_gt": 0,
  "b2b": [
    {
      "patry": "ABC  Company",
      "inv": [
        {
          "inum": "00164",
          "idt": "01-07-2018",
          "val": 525,
          "itms": [
            {
              "num": 1,
              "itm_det": {
                "txval": 500,
                "rt": 5
              }
            }
          ]
        }
      ]
    }
  ]
}


Что я уже пробовал:

<pre lang="vb">

  Private Sub cmdGenerateJson_Click(sender As Object, e As EventArgs) Handles cmdGenerateJson.Click
    Dim JsonHeader As New ClsHeader()
    ''Main 
    JsonHeader.compcode = "COMP0001"
    JsonHeader.fp = "0.00"
    JsonHeader.gt = 0
    JsonHeader.cur_gt = 0
    ''Party  
    Dim b2 As New ClsParty
    b2.party = "ABC Company"
    ''Inv  
    Dim InvDet As New ClsInvoice
    InvDet.inum = 111
    InvDet.idt = "25-08-2018"
    InvDet.val = 525
    ''Item  
    Dim cid As New ClsItem
    cid.num = 1
    ''Item details 
    Dim itmdet As New ClsItemDetails
    itmdet.txval = 500
    itmdet.rt = 5
    JsonHeader.b2b.Add(b2)
    Dim jsonString As String = JsonConvert.SerializeObject(JsonHeader)
    TextBox1.Text = jsonString
  End Sub
End Class

Public Class ClsHeader
  Public Property compcode As String
  Public Property fp As String
  Public Property gt As Int64
  Public Property cur_gt As Int64
  Public Property b2b As New List(Of ClsParty)
End Class

Public Class ClsParty
  Public Property party As String
  Public Property inv As New List(Of ClsInvoice)
End Class

Public Class ClsInvoice
  Public Property inum As String
  Public Property idt As String
  Public Property val As Double
  Public Property itms As New List(Of ClsItem)
End Class

Public Class ClsItem
  Public Property num As Integer
  Public Property itm_det As New List(Of ClsItemDetails)
End Class

Public Class ClsItemDetails
  Public Property txval As Double
  Public Property rt As Double
End Class

Patrice T

Какой результат вы получаете ?

1 Ответов

Рейтинг:
1

Graeme_Grant

Я написал статью, чтобы помочь ответить на вопросы, Часто задаваемые здесь: Работа с JSON в C# и VB[^]

Ваш вопрос касается сериализации класса в raw JSON, что-то не рассмотренное подробно в статье, поэтому я отвечу здесь, используя Newtonsoft Json.NET[^] библиотека.

Чтобы убедиться, что ваши классы соответствуют структуре JSON, я использовал служебный веб-сайт jsonutils[^] (в настоящее время в автономном режиме на момент написания этого ответа - вы можете загрузить и запустить веб-сайт локально: GitHub - bladefist/JsonUtils[^]). Он будет генерировать следующий набор классов:

Public Class ItmDet
    <JsonProperty("txval")>
    Public Property Txval As Integer

    <JsonProperty("rt")>
    Public Property Rt As Integer
End Class

Public Class Itm
    <JsonProperty("num")>
    Public Property Num As Integer

    <JsonProperty("itm_det")>
    Public Property ItmDet As ItmDet
End Class

Public Class Inv
    <JsonProperty("inum")>
    Public Property Inum As String

    <JsonProperty("idt")>
    Public Property Idt As String

    <JsonProperty("val")>
    Public Property Val As Integer

    <JsonProperty("itms")>
    Public Property Itms As Itm()
End Class

Public Class B2b
    <JsonProperty("patry")>
    Public Property Patry As String

    <JsonProperty("inv")>
    Public Property Inv As Inv()
End Class

Public Class Example
    <JsonProperty("CompCode")>
    Public Property CompCode As String

    <JsonProperty("fp")>
    Public Property Fp As String

    <JsonProperty("gt")>
    Public Property Gt As Integer

    <JsonProperty("cur_gt")>
    Public Property CurGt As Integer

    <JsonProperty("b2b")>
    Public Property B2b As B2b()
End Class

Затем в приведенной выше ссылке на статью у меня есть вспомогательный класс для сериализации и десериализации в/из JSON. Вот этот класс из статьи:
Public Module JsonHelper

    Public Function FromClass(Of T)(data As T,
                                    Optional isEmptyToNull As Boolean = False,
                                    Optional jsonSettings As JsonSerializerSettings = Nothing) As String

        Dim response As String = String.Empty

        If Not EqualityComparer(Of T).Default.Equals(data, Nothing) Then
            response = JsonConvert.SerializeObject(data, jsonSettings)
        End If

        Return If(isEmptyToNull, (If(response = "{}", "null", response)), response)

    End Function

    Public Function ToClass(Of T)(data As String,
                                  Optional jsonSettings As JsonSerializerSettings = Nothing) As T

        Dim response = Nothing

        If Not String.IsNullOrEmpty(data) Then
            response = If(jsonSettings Is Nothing,
                          JsonConvert.DeserializeObject(Of T)(data),
                          JsonConvert.DeserializeObject(Of T)(data, jsonSettings))
        End If

        Return response

    End Function

End Module

Теперь, чтобы использовать, это просто следующим образом:
Sub Main()

    Dim rawJson = "{""CompCode"":""COMP0001"",""fp"":""072018"",""gt"":0,""cur_gt"":0,""b2b"":[{""patry"":""ABC  Company"",""inv"":[{""inum"":""00164"",""idt"":""01-07-2018"",""val"":525,""itms"":[{""num"":1,""itm_det"":{""txval"":500,""rt"":5}}]}]}]}"

    ' From JSON to Class
    Dim resultClass = JsonHelper.ToClass(Of Example)(rawJson)

    ' From Class to raw JSON
    Dim resultJson = JsonHelper.FromClass(resultClass)

End Sub


S4753

Статья очень полезна, но нужна ваша помощь в создании RawJson систематически и быстро.

Graeme_Grant

Смотрите ответ выше. Я только что показал вам, как десериализовать и сериализовать. Тот же принцип используется, если вы сами создаете данные класса перед сериализацией.