如何在 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; }

而不是我的专辑响应类?

如何在 c# 中反序列化 json 字符串 NOT 到 List<object>

一个原始的 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...
相关文章: