2016-12-10 132 views
2

如何反序列化C#中嵌套列表JSON,我的活动始终为空。 请帮助我。无法找到我要出错的地方。任何帮助将非常感激。反序列化C#中嵌套列表JSON#

我想反序列化的代码,但没有得到活动。我的项目是:

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 
using System.ComponentModel.DataAnnotations; 

public class Program 
{ 
    public static void Main() 
    { 
     string json = @" 
      { 
    ""Title"": ""test"", 
    ""Id"": ""SR21576"", 
    ""CreatedDate"": ""2016-12-10T09:21:06+03:30"", 
    ""DisplayName"": ""SR21576 : test"", 
    ""Description"": ""10"", 
    ""AlternateContactMethod"": null, 
    ""AffectedUser"": null, 
    ""AssignedToUser"": ""XXX\\BB Team"", 
    ""CustomerCode"": ""00000000-0000-0000-0000-000000000000"", 
    ""CustomerName"": null, 
    ""ContractId"": ""00000000-0000-0000-0000-000000000000"", 
    ""ContractTitle"": null, 
    ""ContractDetailsId"": ""00000000-0000-0000-0000-000000000000"", 
    ""ContractDetailsTitle"": null, 
    ""CRMLink"": null, 
    ""LeadId"": ""00000000-0000-0000-0000-000000000000"", 
    ""LeadTitle"": null, 
    ""Urgency"": ""b02d9277-a9fe-86f1-e95e-0ba8cd4fd075"", 
    ""Priority"": ""1e070214-693f-4a19-82bb-b88ee6362d98"", 
    ""Source"": ""57e11419-ac27-a6fa-97f1-0ec2a9722807"", 
    ""Area"": ""3c5e6037-b057-5745-4d89-e95f67d3236b"", 
    ""SupportGroup"": ""ae536997-8124-85e7-496e-225b7991a450"", 
    ""Attachments"": [ ], 
    ""Activities"": [ 
    { 
     ""<Id>k__BackingField"": ""ffe60a69-f3c8-adbe-9bbd-4050d766cc81"", 
     ""<ActivityID>k__BackingField"": ""MA21578"", 
     ""<Title>k__BackingField"": ""a"", 
     ""<Status>k__BackingField"": ""Ready"", 
     ""<TypeOfActivity>k__BackingField"": 1 
    }, 
    { 
     ""<Id>k__BackingField"": ""91286e74-6a39-964f-040f-5daf99e84792"", 
     ""<ActivityID>k__BackingField"": ""RA21579"", 
     ""<Title>k__BackingField"": ""b"", 
     ""<Status>k__BackingField"": ""Ready"", 
     ""<TypeOfActivity>k__BackingField"": 0 
    }, 
    { 
     ""<Id>k__BackingField"": ""9754f1a1-d37b-265a-087a-f6688808dbeb"", 
     ""<ActivityID>k__BackingField"": ""MA21577"", 
     ""<Title>k__BackingField"": ""c"", 
     ""<Status>k__BackingField"": ""Active"", 
     ""<TypeOfActivity>k__BackingField"": 1 
    }, 
    { 
     ""<Id>k__BackingField"": ""d959cac5-cb78-a3fb-09e2-76da1b5381b2"", 
     ""<ActivityID>k__BackingField"": ""MA21580"", 
     ""<Title>k__BackingField"": ""d"", 
     ""<Status>k__BackingField"": ""Ready"", 
     ""<TypeOfActivity>k__BackingField"": 1 
    } 
    ], 
    ""Status"": ""InProgress"" 
}"; 


     ServiceRequest items = JsonConvert.DeserializeObject<ServiceRequest>(json); 

     Console.WriteLine("Area: " + items.Area); 
     Console.WriteLine("CRMLink: " + items.CRMLink); 

     Console.WriteLine("Number of Activities: " + items.Activities.Count); 

     int i = 0; 
     //Activities are null why??????? 
     foreach (var type in items.Activities) 
     { 
      i++; 
      Console.WriteLine("Activities item number " + i); 
      Console.WriteLine("ActivityID: " + type.ActivityID); 
      Console.WriteLine("Id: " + type.Id); 
      Console.WriteLine("Status: " + type.Status); 
      Console.WriteLine("Title: " + type.Title); 
      Console.WriteLine("TypeOfActivity: " + type.TypeOfActivity); 
      Console.WriteLine(); 
     } 
    } 
} 

[Serializable] 
public class Activity 
{ 
    public Guid Id { get; set; } 
    public String ActivityID { get; set; } 
    public String Title { get; set; } 
    public String Status { get; set; } 

    public ActivityType TypeOfActivity { get; set; } 
} 

[Serializable] 
public enum ActivityType 
{ 
    ReviewActvity, 
    ManualActivity 
} 

[Serializable] 
public class Attachment 
{ 
    [Required] 
    public string FileName { get; set; } 
    [Required] 
    public string ServerFileName { get; set; } 
    public bool ToRemove { get; set; } 
    [Required] 
    public string AttachedByUser { get; set; } 

} 

[Serializable] 
public class ServiceRequest 
{ 
    [Required] 
    public string Title { get; set; } 
    public String Id { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public string DisplayName { get; set; } 
    [Required] 
    public string Description { get; set; } 
    public string AlternateContactMethod { get; set; } 
    public string AffectedUser { get; set; } 
    public string AssignedToUser { get; set; } 
    public Guid CustomerCode { get; set; } 
    public string CustomerName { get; set; } 
    public Guid ContractId { get; set; } 
    public string ContractTitle { get; set; } 
    public Guid ContractDetailsId { get; set; } 
    public string ContractDetailsTitle { get; set; } 
    public string CRMLink { get; set; } 
    public Guid LeadId { get; set; } 
    public string LeadTitle { get; set; } 
    public Guid Urgency { get; set; } 
    public Guid Priority { get; set; } 
    public Guid Source { get; set; } 
    public Guid Area { get; set; } 
    public Guid SupportGroup { get; set; } 
    public List<Attachment> Attachments { get; set; } 
    public List<Activity> Activities { get; set; } 
    public string Status { get; set; } 
} 
+0

为什么JSON实际上是双引号的?目前,你的字符串不是有效的JSON。 –

+0

是真的json:“” k__BackingField“”:“”ffe60a69-f3c8-adbe-9bbd-4050d766cc81“?这个” k__BackingField“而不是id是原因,因为你不能反序列化它 –

+0

它是否正确地反序列化如果你删除'k__BackingField'标记(例如' k__BackingField'为'Id')?这是由默认的上下文解析器生成的,你可能想设置'IgnoreSerializableAttribute = true',否则。 – OnoSendai

回答

5

谁最初生成的JSON Activities集合选择序列化领域对象的。而且由于该课程完全由自动实施的属性组成,因此您可以获得secret backing fields

要强制Json.NET反序列化的Activity而非其属性的公共和私人领域,标志着以[JsonObject(MemberSerialization.Fields)]类型:

[Serializable] 
[JsonObject(MemberSerialization.Fields)] 
public class Activity 
{ 
    public Guid Id { get; set; } 
    public String ActivityID { get; set; } 
    public String Title { get; set; } 
    public String Status { get; set; } 

    public ActivityType TypeOfActivity { get; set; } 
} 

或者,解决最初产生JSON序列化的属性代码而不是田地。这似乎是一个有意识的选择,因为根类型ServiceRequest的属性是序列化的,而不是它的字段。

样品fiddle

0

方法1:从Activity类中删除[Serializable]属性。

如果不是绝对必要的话,删除将会阻止默认的DataContractJsonSerializer生成额外的标记。

方法2:配置串行器忽略[Serializable]属性:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
new DefaultContractResolver { IgnoreSerializableAttribute = true }; 

Reference