C# JSON 反序列化秒数

本文关键字:反序列化 JSON | 更新日期: 2023-09-27 18:33:35

我正在使用以下json字符串:

{
"response":
[{"aid":108787020,
"owner_id":2373452,
"artist":" Moby",
"title":"Flowers",
"duration":208,
"url":"https:'/'/cs1-50v4.vk-cdn.net'/p3'/c762273870cc49.mp3?extra=t9I-RMkSlAHkhe8JtOUUZBTZqkFVE9MJ_Q-TPmOhxPHTfHazQWEYBf4LqrOY64xLX9AuzaKwvLo4PECSFiHyWM53WMDWVcBAZVT5jlIbZ9X8ag","lyrics_id":"6060508",
"genre":22}
]
}

我这里有以秒为单位的歌曲持续时间。如何以 (mm:ss) 格式的持续时间反序列化整个响应?

C# JSON 反序列化秒数

如果我

理解正确,您希望按原样反序列化整个response对象,但将duration存储为mm:ss字符串。

正如 Tinwor 建议的那样,您可以使用 JSON.NET 将字符串/响应反序列化为可在 .NET 应用程序中使用的类型。我将使用与Tinwor相同的类。但是,我将使用JsonConverter.JsonConverters 可用于在序列化或反序列化属性之前访问属性。我把我的命名为SecondsToStringConverter.

public class ResponseRoot
{
   public List<Response> response { get; set; }
}
public class Response
{
    public int aid { get; set; }
    public int owner_id { get; set; }
    public string artist { get; set; }
    public string title { get; set; }
    [JsonConverter(typeof(SecondsToStringConverter))]
    public string duration { get; set; }
    public string url { get; set; }
    public string lyrics_id { get; set; }
    public int genre { get; set; }
}
class SecondsToStringConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return $"{(long)reader.Value / 60}:{(long)reader.Value % 60}";
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof (int);
    }
}

然后,您可以像这样反序列化您的 json:

var resp = JsonConvert.DeserializeObject<ResponseRoot>(jsonstring);

duration属性现在存储"3:08"。

使用以下类 JSON.Net 反序列化类:

public class Response
{
    public int aid { get; set; }
    public int owner_id { get; set; }
    public string artist { get; set; }
    public string title { get; set; }
    public int duration { get; set; }
    public string url { get; set; }
    public string lyrics_id { get; set; }
    public int genre { get; set; }
}
public class RootObject
{
    public List<Response> response { get; set; }
}

然后,您可以使用Timespan.FromSeconds来获取以mm:ss为单位的持续时间。如果需要,可以创建函数来转换数据:

private string toMinutesAndSeconds(int duration) {
    return String.Format("{0}:{1}", duration/60, duration%60);
}