2015-10-17 1 views
1

Considérons la chaîne JSON suivante donnée:C# Json entier désérialiser taper par exemple

{ 
    "items": 
    [ 
     { 
      ..., 
      "view_count":4, 
      "answer_count":0, 
      "score":0, 
      "last_activity_date":1445071150 
     } 
    ], 
    ... 
} 

Est-il possible d'avoir last_activity_date désérialisée comme exemple d'un autre type en utilisant System.Runtime.Serialization.DataContractAttribute et System.Runtime.Serialization.Json.DataContractJsonSerializer?

Par exemple: 1445071150 ->DateDate est

[System.Runtime.Serialization.DataContract] 
public class Date 
{ 
    [System.Runtime.Serialization.IgnoreDataMember] 
    public long ElapsedSeconds { get; set; } 

    [System.Runtime.Serialization.IgnoreDataMember] 
    public DateTime Date { get { ... } set; } 

    public Date(long seconds) 
    { 
     ElapsedSeconds = seconds; 
     Date = ...; 
    } 

    public static implicit operator Date(long seconds) 
    { 
     return new Date(seconds); 
    } 

    // Other members ... 
} 
+0

Je pense que vous devriez mettre en œuvre '' IContractResolver: http://www.newtonsoft.com/json/help/html/contractresolver.htm et utiliser propre 'Converter' pour ça. – pwas

Répondre

2

Vous pourriez avoir une définition comme ça:

[DataContract] 
public class Item 
{ 
    [DataMember(Name = "view_count")] 
    public int ViewCount { get; set; } 

    [DataMember(Name = "answer_count")] 
    public int AnswerCount { get; set; } 

    [DataMember(Name = "score")] 
    public int Score { get; set; } 

    [IgnoreDataMember] 
    public Date LastActivityDate { get; private set; } 

    [DataMember(Name = "last_activity_date")] 
    private long Date 
    { 
     set 
     { 
      LastActivityDate = value; 
     } 
     get 
     { 
      return LastActivityDate.ElapsedSeconds; 
     } 
    } 
} 

Maintenant, lorsque le JSON est désérialisée, le poseur de la propriété Date prendra soin de définir le membre LastActivityDate.

Et voici un exemple complet:

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 

[DataContract] 
public class Root 
{ 
    [DataMember(Name = "items")] 
    public Item[] Items { get; set; } 
} 

[DataContract] 
public class Item 
{ 
    [DataMember(Name = "view_count")] 
    public int ViewCount { get; set; } 

    [DataMember(Name = "answer_count")] 
    public int AnswerCount { get; set; } 

    [DataMember(Name = "score")] 
    public int Score { get; set; } 

    [IgnoreDataMember] 
    public Date LastActivityDate { get; private set; } 

    [DataMember(Name = "last_activity_date")] 
    private long Date 
    { 
     set 
     { 
      LastActivityDate = value; 
     } 
     get 
     { 
      return LastActivityDate.ElapsedSeconds; 
     } 
    } 
} 

[DataContract] 
public class Date 
{ 
    [IgnoreDataMember] 
    public long ElapsedSeconds { get; set; } 

    public Date(long seconds) 
    { 
     ElapsedSeconds = seconds; 
    } 

    public static implicit operator Date(long seconds) 
    { 
     return new Date(seconds); 
    } 
} 

static class Program 
{ 
    static void Main() 
    { 
     string json = 
      @"{ 
       ""items"": 
       [ 
        { 
         ""view_count"":4, 
         ""answer_count"":0, 
         ""score"":0, 
         ""last_activity_date"":1445071150 
        } 
       ] 
      }"; 

     var serializer = new DataContractJsonSerializer(typeof(Root)); 
     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
     { 
      var root = (Root)serializer.ReadObject(stream); 
      Console.WriteLine(root.Items[0].LastActivityDate.ElapsedSeconds); 
     } 
    } 
}