c# Json将整数反序列化为实例类型

本文关键字:实例 类型 反序列化 整数 Json | 更新日期: 2023-09-27 18:18:03

考虑下面给出的json字符串:

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

是否有办法将last_activity_date反序列化为使用System.Runtime.Serialization.DataContractAttributeSystem.Runtime.Serialization.Json.DataContractJsonSerializer的另一种类型的实例?

。: 1445071150 -> Date,其中Date

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

c# Json将整数反序列化为实例类型

你可以这样定义:

[DataContract]
public class Item
{
    [DataMember(Name = "view_count")]
    public int ViewCount { get; set; }
    [DataMember(Name = "answerswer_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;
        }
    }
}

现在,当JSON被反序列化时,Date属性的setter将负责设置LastActivityDate成员。

这里有一个完整的例子:

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 = "answerswer_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,
                        ""answerswer_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);
        }
    }
}