【问题标题】:How to Write JSON with Properties and SubProperties如何编写带有属性和子属性的 JSON
【发布时间】:2017-01-27 12:46:46
【问题描述】:

我需要编写 JSON 字符串并将其发送到 Web 服务。 我必须按如下方式创建 JSON

{
    "SALES": [
        {
            "INDEX_NX": 1,
            "Audios": [
                {
                    "Name": "audio_file",
                    "Content": "string_base64",
                    "Extension": "WAV",
                    "Id": "1236585"
                }
            ],
            "Documents": [
                {
                    "Name": "proposal_based",
                    "Content": "string_base64",
                    "Extension": "PNG",
                    "Type_document": "PROPOSAL SIGNED"
                },
                {
                    "Name": "document_with_photo",
                    "Content": "string_base64",
                    "Extension": "PNG",
                    "Document_type": "CNH"
                }
            ]
        }
    ]
}

如何使用 newntonsoft 类做到这一点?

【问题讨论】:

  • 从技术上讲,这不是有效的 json - 您可能不小心剪掉了尾随 ]}。否则,您需要一些类似的类来存储数据。我不知道“尝试过”是什么意思

标签: json vb.net json.net


【解决方案1】:

你需要创建相应的类来创建这样的 JSON,然后你可以序列化它们的对象来创建这个 JSON。

我不是 VB.NET 的人,所以我用 C# 编写了这个,并使用一些在线工具转换为 VB.NET 代码。

Imports Newtonsoft.Json
Imports System.Collections.Generic

Public Class SalesContainer

   <JsonProperty(PropertyName:="SALES")>  _
   Public Property Sales As List(Of SalesClass)

End Class

Public Class SalesClass

    <JsonProperty(PropertyName:="INDEX_NX")>  _
    Public Property Index As Integer

    <JsonProperty(PropertyName:="Audios")>  _
    Public Property Audio As List(Of AudioClass)

    <JsonProperty(PropertyName:="Documents")>  _
    Public Property Documents As List(Of DocumntClass)

End Class

Public Class AudioClass

    Public Property Name As String

    Public Property Content As String

    Public Property Extension As String

    Public Property Id As Integer

End Class

Public Class DocumentClass

    Public Property Name As String

    Public Property Content As String

    Public Property Extension As String

    Public Property Document_type As String

    Public Property Type_Document As String

End Class

您可以按如下方式创建 JSON。

Imports System
Imports Newtonsoft.Json
Imports System.Collections.Generic

Public Module mainModule  
    Sub Main()  
        Dim salescontainer AS New SalesContainer
        salescontainer.Sales = New List(Of SalesClass)

        Dim sales As New SalesClass

        sales.Audio = New List(Of AudioClass)
        sales.Audio.Add(New AudioClass() With {.Id=1236585, .Name="audio_file", .Content="string_base64", .Extension="WAV"})

        sales.Documents = New List(Of DocumntClass)()
        sales.Documents.Add(New DocumntClass() With {.Name="proposal_based", .Content="string_base64", .Extension="PNG", .Type_Document="PROPOSAL SIGNED"})
        sales.Documents.Add(New DocumntClass() With {.Name="document_with_photo", .Content="string_base64", .Extension="PNG", .Document_type="CNH"})

        salescontainer.Sales.Add(sales)

        Dim serializerSettings As New JsonSerializerSettings
        serializerSettings.NullValueHandling = NullValueHandling.Ignore

        Dim jsonData = JsonConvert.SerializeObject(salescontainer, serializerSettings)
        Console.WriteLine(jsonData)

    End Sub  
End Module

【讨论】:

  • 这不应该被接受为答案。代码由于转换错误而损坏,需要大量工作来修复。提示,VB 中没有var。如果您将这些乱七八糟的东西粘贴到一个简单的 VB 控制台应用程序中,您就会发现它有多糟糕。
  • @MrGadget 我为错误的代码道歉。感谢您指出。我已经更正了答案中的代码。我希望现在一切正常。如果仍然有问题,我很乐意纠正。
【解决方案2】:

在 Visual Studio 2015(可能还有之前的版本)中,您可以启动一个新的类代码文件,并在剪贴板中使用该打开且格式正确的 JSON,Edit 菜单具有 Paste Special > Paste JSON as Classes,其中做得不错(但不是很完美)。由此,我们得到了下面的类,以及一个从这些类生成 JSON 的小模块。

Imports Newtonsoft.Json

Module Module1

    Sub Main()
        Dim Docs As New List(Of Document)
        Docs.Add(New Document With {
            .Name = "proposal_based",
            .Content = "string_base64",
            .Extension = "PNG",
            .Type_document = "PROPOSAL"})
        Docs.Add(New Document With {
            .Name = "document_with_photo",
            .Content = "string_base64",
            .Extension = "PNG",
            .Document_type = "CNH"})

        Dim Rootobject As New Rootobject
        With Rootobject
            .SALES = {New SALE With {
                .INDEX_NX = 1,
                .Audios = {New Audio With {
                    .Name = "audio_file",
                    .Content = "string_base64",
                    .Extension = "WAV",
                    .Id = "1236585"}},
                .Documents = Docs.ToArray}}
        End With

        Dim Settings As New JsonSerializerSettings
        Settings.Formatting = Formatting.Indented
        Settings.NullValueHandling = NullValueHandling.Ignore

        Dim JSON As String = JsonConvert.SerializeObject(Rootobject, Settings)

        Debug.Print(JSON)
        ' Submit JSON to your web service
    End Sub

End Module

Public Class Rootobject
    Public Property SALES As SALE()
End Class

Public Class SALE
    Public Property INDEX_NX As Integer
    Public Property Audios As Audio()
    Public Property Documents As Document()
End Class

Public Class Audio
    Public Property Name As String
    Public Property Content As String
    Public Property Extension As String
    Public Property Id As String
End Class

Public Class Document
    Public Property Name As String
    Public Property Content As String
    Public Property Extension As String
    Public Property Type_document As String
    Public Property Document_type As String
End Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2011-01-17
    • 2021-11-02
    • 2017-07-27
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多