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) 格式的持续时间反序列化整个响应?
如果我
理解正确,您希望按原样反序列化整个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);
}