将 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
更新这里是我的Event
class
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 中的字段实际匹配(而不是示例中的虚拟数据),那么您可以使用 JArray
的 ToObject
方法将 JArray 转换为事件列表。
这避免了必须生成 C# classes 来表示您并不真正感兴趣的数据的其他部分:
dynamic resultJSON = JsonConvert.DeserializeObject<dynamic>(json);
ListEvents list = new ListEvents();
list.Events = ((JArray)resultJSON.Result.Events).ToObject<List<Event>>();
我正在尝试序列化来自 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
更新这里是我的Event
class
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 中的字段实际匹配(而不是示例中的虚拟数据),那么您可以使用 JArray
的 ToObject
方法将 JArray 转换为事件列表。
这避免了必须生成 C# classes 来表示您并不真正感兴趣的数据的其他部分:
dynamic resultJSON = JsonConvert.DeserializeObject<dynamic>(json);
ListEvents list = new ListEvents();
list.Events = ((JArray)resultJSON.Result.Events).ToObject<List<Event>>();