2016-12-10 10 views
2

C#でネストされたリストを使用してJSONを逆シリアル化する方法は、常にnullです。 私を助けてください。私が間違っているところへ行くことができません。どんな助けでも本当に感謝しています。C#でネストされたリストを使用してJSONを逆シリアル化する

コードをデシリアライズしようとしていますが、アクティビティを取得しようとしていません。私のプロジェクトは、次のとおりです。もともとあなたActivitiesコレクションのための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 "は理由です。 –

+0

正しくデシリアライズしますか'' IgnoreSerializableAttribute = true'を設定したい場合は、 '' IgnoreSerializableAttribute = true'を設定してください。 – OnoSendai

答えて

5

フィールドオブジェクトのをシリアル化することを選びました。クラスは完全に自動実装されたプロパティで構成されているため、secret backing fieldsを取得しています。もともとプロパティをシリアル化するためにJSONを生成されたコードを修正し、

[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; } 
} 

または:

[JsonObject(MemberSerialization.Fields)]とタイプをマークし、むしろその性質より ActivityのパブリックおよびプライベートフィールドをデシリアライズするJson.NETを強制するにはフィールドに優先して。これは、ルート型 ServiceRequestのフィールドがシリアル化されているため、意識的な選択だったようです。

サンプルfiddle

0

方法1Activityクラスの[Serializable]属性を削除します。

削除すると、デフォルトのDataContractJsonSerializerで余分なマーカーが生成されなくなります。

方法2

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

Reference[Serializable]属性を無視するようにシリアライザを構成します。

関連する問題