将 JSON 响应反序列化为特定的 class 对象

Deserializing JSON response into specific class objects

我正在尝试序列化来自 API 的 JSON 结果。结果具有以下结构:

{
 "Version" : "123",
 "Message" : "some string",
 "Status" : 200,
 "Result" : { 
       "Events" :  [ {"Subprop1" : "some_value"}, {"Subprop2" : "some_value"} ],
       "Merch" :   [ {"Subprop2" : "some_value"}, {"Subprop2" : "some_value"} ],
       "Tickets" : [ {"Subprop3" : "some_value"}, {"Subprop2" : "some_value"} ],
       "Seasons" : [ {"Subprop4" : "some_value"}, {"Subprop2" : "some_value"} ] 
 }
}

我的问题是:如何将其正确反序列化为我创建的 classes 的对象?我为 Result 的每个属性(即事件、商品等)做了 classes

到目前为止我的代码:

dynamic resultJSON = JsonConvert.DeserializeObject<dynamic>(response.Content);
dynamic data = resultJSON.Result;
Newtonsoft.Json.Linq.JArray events = resultJSON.Result.Events;

resultJSON 包含对象中的所有内容。我如何在他们自己的 classes 中反序列化它?并避免 JArray

更新这里是我的Eventclass

    public class Event
    {
      public int OrderId { get; set; }
      public int Id { get; set; }
      public string Name{ get; set; }
      public string Type { get; set; }
    
}

public class ListEvents
{
    public List<Event> Events { get; set; }
}

定义 Json 为 类:

public class Response
{
    public string Version { get; set; }
    public string Message { get; set; }
    public int Status { get; set; }
    public Result Result { get; set; }
}

public class Result
{
    public Event[] Events { get; set; }
    public Merch[] Merch { get; set; }
    public Ticket[] Tickets { get; set; }
    public Season[] Seasons { get; set; }
}

public class Event
{
    public string Subprop1 { get; set; }
    public string Subprop2 { get; set; }
}

public class Merch
{
    public string Subprop2 { get; set; }
}

public class Ticket
{
    public string Subprop3 { get; set; }
    public string Subprop2 { get; set; }
}

public class Season
{
    public string Subprop4 { get; set; }
    public string Subprop2 { get; set; }
}

如果您使用 Visual Studio,您可以复制 json 并使用 Edit > Paste Special > Paste JSON as Classes

然后反序列化:

var response = JsonSerializer.Deserialize<Response>(jsonString);

假设 JSON 中的 Events 数组中的项目值与您显示的 Event class 中的字段实际匹配(而不是示例中的虚拟数据),那么您可以使用 JArrayToObject 方法将 JArray 转换为事件列表。

这避免了必须生成 C# classes 来表示您并不真正感兴趣的数据的其他部分:

    dynamic resultJSON = JsonConvert.DeserializeObject<dynamic>(json);
    ListEvents list = new ListEvents();
    list.Events = ((JArray)resultJSON.Result.Events).ToObject<List<Event>>();

演示:https://dotnetfiddle.net/nr5ME3