Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Newtonsoft在Vb.net中反序列化更复杂的Json文档_Json_Vb.net_Json.net - Fatal编程技术网

如何使用Newtonsoft在Vb.net中反序列化更复杂的Json文档

如何使用Newtonsoft在Vb.net中反序列化更复杂的Json文档,json,vb.net,json.net,Json,Vb.net,Json.net,我有一个RESTAPI,它返回一个json响应,这是一个文档数组,而文档数组本身又有多个数组。下面是一个我喜欢反序列化的文档示例 { "DocId": "contact::6f128681-218d-409d-b71d-31031852057d", "Name": "Joe F Miller", "buckets": [ { "DocId": "

我有一个RESTAPI,它返回一个json响应,这是一个文档数组,而文档数组本身又有多个数组。下面是一个我喜欢反序列化的文档示例

{
             "DocId": "contact::6f128681-218d-409d-b71d-31031852057d",
             "Name": "Joe F Miller",
             "buckets": [
                {
                     "DocId": "leadbucket::5652A756-5B58-45A5-9566-9C85E8783440",
                     "text": "Dead Leads"
                },
                {
                     "DocId": "leadbucket::8A234FC1-6389-485D-8BDE-7FCB1E7639E0",
                     "text": "No Follow-Up Needed"
                },
                {
                     "DocId": "leadbucket::C97632BE-5A24-4AE7-8D18-4DFE174F0D0F",
                     "text": "Long-Term Buyers"
                },
                {
                     "DocId": "leadbucket::D6802064-8AC5-4E5A-855E-B59C32859C81",
                     "text": "New Lead"
                }
            ],
             "emails": [
                {
                     "other": "demo@test.com"
                },
                {
                     "work": "work@demo.com"
                },
                {
                     "work": "work2@demo.com"
                }
            ],
             "followup": {
                 "date": "05/01/2019",
                 "type": "phone"
            },
             "lastactivity": "04/05/2019",
             "phones": [
                {
                     "home": "(213) 444-2222"
                },
                {
                     "work": "(949) 555-1212"
                }
            ],
             "tags": [
                {
                     "DocId": "tag::FC276FBD-DC3A-4E18-8244-E89EF24E022E",
                     "text": "Buyer"
                },
                {
                     "DocId": "tag::EA5DE0FB-34B0-4F7C-B631-177D6BD2F65E",
                     "text": "Investor"
                }
            ]
        }
从API得到响应后,我使用下面的代码尝试转换数据

ContactList = JsonConvert.DeserializeObject(Of List(Of Contact.ContactList))(read.Item("Data").ToString)
因此,我希望有人能为我指明正确的方向,告诉我如何创建一个类来存储这种类型的文档,以及如何对其进行反序列化。我必须在我的类中这样做,还是必须为Json中的每个数组调用反序列化


我的另一个问题是电子邮件和电话部分,因为键值不是唯一的,我也不知道会返回什么。我将如何构建一个类来存储这些内容,因为键字段可能会发生变化。

例如,使用
IEnumerable(字典(字符串、字符串的))
来反序列化具有未定义元素数目的JSON对象,每个对象具有未定义的(键、值)对组合。
关键部分也可以重复,如示例所示:

 "emails": [
    {"other": "demo@test.com"},
    {"work": "work@demo.com"},
    {"work": "work2@demo.com"}
其他
工作
键每次可能不同,并且可能重复

使用
IEnumerable(字典的(字符串的,字符串的))
反序列化/序列化此属性,允许

示例类对象Contacts包含执行JSON对象的反序列化和对象根的序列化的方法(此处为简化方法),从而复制原始JSON对象

这些方法是静态的(共享的),您只需调用该方法,无需创建Contacts类的实例。
例如,反序列化JSON对象(从服务接收的字符串):

将类对象序列化回原始字符串:

Dim myJsonContacts = Contacts.SerializeJSON(myContacts)
将刚刚序列化的JSON与原始JSON进行比较,看看它们是否匹配

列出反序列化类对象中的所有电子邮件和电话号码:
(仅举一个例子:不需要转换为列表)

访问单个电子邮件(或电话号码):
(当然可以使用从字典中提取
(键、值)
对的任何其他方法)

从特定位置获取所有电子邮件(
工作
,此处):


联系人
类别:
某些属性用
装饰。属性名称已更改,因为原始JSON使用的名称是语言中的保留关键字

例如:


Public Property BucketText作为字符串

Imports Newtonsoft.Json

Public Class Contacts

    Public Shared Function DeserializeJSON(JsonObject As String) As RootObject
        Return JsonConvert.DeserializeObject(Of RootObject)(JsonObject)
    End Function

    Public Shared Function SerializeJSON(classObject As RootObject) As String
        Return JsonConvert.SerializeObject(classObject)
    End Function

    Partial Public Class RootObject
        Public Property DocId As String
        Public Property Name As String
        Public Property Buckets As List(Of Bucket)
        Public Property Emails As Dictionary(Of String, String)()
        Public Property Followup As Followup
        Public Property Lastactivity As String
        Public Property Phones As IEnumerable(Of Dictionary(Of String, String))
        Public Property Tags As List(Of Tag)
    End Class

    Partial Public Class Bucket
        Public Property DocId As String
        <JsonProperty("text")>
        Public Property BucketText As String
    End Class

    Partial Public Class Tag
        Public Property DocId As String
        <JsonProperty("text")>
        Public Property TagText As String
    End Class

    Partial Public Class Followup
        <JsonProperty("date")>
        Public Property FollowupDate As String

        <JsonProperty("type")>
        Public Property FollowupType As String
    End Class
End Class
导入Newtonsoft.Json
公共类联系人
作为根对象的公共共享函数反序列化JSON(JsonObject作为字符串)
返回(RootObject的)JsonConvert.DeserializeObject(JsonObject)
端函数
公共共享函数将JSON(类对象作为根对象)序列化为字符串
返回JsonConvert.SerializeObject(类对象)
端函数
部分公共类根对象
公共属性DocId作为字符串
作为字符串的公共属性名称
公共财产存储桶作为列表(存储桶的列表)
公共属性电子邮件作为字典(字符串,字符串)()
作为后续行动的公共财产后续行动
公共属性Lastactivity作为字符串
公共属性电话作为IEnumerable(字典的(字符串的,字符串的))
公共属性标记作为列表(标记的列表)
末级
部分公共类桶
公共属性DocId作为字符串
公共属性BucketText作为字符串
末级
部分公共类标记
公共属性DocId作为字符串
公共属性标记文本为字符串
末级
部分公开课跟进
公共属性FollowupDate为字符串
公共属性后续类型为字符串
末级
末级

Try,它将生成正确的类结构,将JSON反序列化为如何以及在何处实现IEnumerable(Of Dictionary(Of String,String))?我假设我会把它放在一个类中,这个类定义了这个类的数据。我能够将我在类中创建的桶和标记作为列表(标记列表)计算出来
myContacts.Emails.ToList().ForEach(
    Sub(em) Console.WriteLine($"from: {em.Keys(0)}, Email: {em.Values(0)}"))

myContacts.Phones.ToList().ForEach(
    Sub(ph) Console.WriteLine($"place: {ph.Keys(0)}, Phone Number: {ph.Values(0)}"))
Dim eMailFrom = myContacts.Emails(0).Keys(0)
Dim eMailValue = myContacts.Emails(0).Values(0)
Dim emailFromWork = myContacts.Emails.Where(Function(em) em.Keys.Contains("work"))
Imports Newtonsoft.Json

Public Class Contacts

    Public Shared Function DeserializeJSON(JsonObject As String) As RootObject
        Return JsonConvert.DeserializeObject(Of RootObject)(JsonObject)
    End Function

    Public Shared Function SerializeJSON(classObject As RootObject) As String
        Return JsonConvert.SerializeObject(classObject)
    End Function

    Partial Public Class RootObject
        Public Property DocId As String
        Public Property Name As String
        Public Property Buckets As List(Of Bucket)
        Public Property Emails As Dictionary(Of String, String)()
        Public Property Followup As Followup
        Public Property Lastactivity As String
        Public Property Phones As IEnumerable(Of Dictionary(Of String, String))
        Public Property Tags As List(Of Tag)
    End Class

    Partial Public Class Bucket
        Public Property DocId As String
        <JsonProperty("text")>
        Public Property BucketText As String
    End Class

    Partial Public Class Tag
        Public Property DocId As String
        <JsonProperty("text")>
        Public Property TagText As String
    End Class

    Partial Public Class Followup
        <JsonProperty("date")>
        Public Property FollowupDate As String

        <JsonProperty("type")>
        Public Property FollowupType As String
    End Class
End Class