如何在 c# 中反序列化 json 字符串 NOT 到 List
本文关键字:NOT List object 字符串 json 反序列化 | 更新日期: 2023-09-27 18:33:38
我正在使用 Vk.com API,特别是这个 JSON 字符串:
{
"response":
[338775,
{"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}
]
}
我有一个用于解析数据的类:
public class AlbumResponse
{
[JsonProperty("artist")]
public string artist { get; set; }
[JsonProperty("title")]
public string title { get; set; }
[JsonProperty("duration")]
public string duration { get; set; }
[JsonProperty("url")]
public string url { get; set; }
}
和反序列化列表:
public class VkAlbum
{
public List<AlbumResponse> response { get; set; }
}
比我用的
var album = JsonConvert.DeserializeObject<VkAlbum>(responseText);
但它不起作用(类型为"Newtonsoft.Json.JsonSerializationException"的第一次机会异常),因为"响应"后面的"338775"。那么如何在不使用的情况下反序列化它
public List<object> response { get; set; }
而不是我的专辑响应类?
一个原始的 JSON 卫生工具供您使用。不是最优雅的代码,但我相信你可以从这里开始。
responseText = Regex.Replace(responseText, "['t|'r'n]", "");
if (responseText.IndexOf("response'": [") != -1)
{
int start = responseText.IndexOf('[') + 1;
int end = responseText.IndexOf(',', start);
responseText = responseText.Substring(0, start) + responseText.Substring(end + 1);
}
var album = JsonConvert.DeserializeObject<VkAlbum>(responseText);
从技术上讲,json响应并不等同于C#List<AlbumResponse>
。JSON 数组允许混合类型,因此本质上它可以包含数字和其他嵌套对象,在您的情况下AlbumResponse
。
您可以通过使用 List<object>
并检查它的第一个元素(如果是数字)来避免异常,如果是,则忽略或执行任何您想做的事情,并在列表中键入第二个元素以AlbumResponse
。
例如
var res = response [1] as AlbumResponse;
if(res!=null)
{
// do something interesting...