根据返回的状态代码将JSON对象反序列化为字符串或具体类型



这是我的Rootobject类,由VS.中的"粘贴特殊"生成

public class Rootobject
{
public string formatVersion { get; set; }
public Matrix[][] matrix { get; set; }
public Summary summary { get; set; }
}
public class Summary
{
public int successfulRoutes { get; set; }
public int totalRoutes { get; set; }
}
public class Matrix
{
public int statusCode { get; set; }
public object response { get; set; }
public Detailederror detailedError { get; set; }
}
public class Detailederror
{
public string message { get; set; }
public string code { get; set; }
}

这是根据建模的

{
"formatVersion": "0.0.1",
"matrix": [
[
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 95028,
"travelTimeInSeconds": 4581,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:04:38+01:00"
}
}
},
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 97955,
"travelTimeInSeconds": 4928,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:10:25+01:00"
}
}
}
],
[
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 105077,
"travelTimeInSeconds": 4725,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:07:01+01:00"
}
}
},
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 108004,
"travelTimeInSeconds": 5072,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:12:48+01:00"
}
}
}
],
[
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 103661,
"travelTimeInSeconds": 4624,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:05:21+01:00"
}
}
},
{
"statusCode": 200,
"response": {
"routeSummary": {
"lengthInMeters": 106588,
"travelTimeInSeconds": 4971,
"trafficDelayInSeconds": 0,
"trafficLengthInMeters": 0,
"departureTime": "2021-10-03T09:48:17+01:00",
"arrivalTime": "2021-10-03T11:11:08+01:00"
}
}
}
],
[
{
"statusCode": 400,
"response": "Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"detailedError": {
"message": "Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"code": "MAP_MATCHING_FAILURE"
}
},
{
"statusCode": 400,
"response": "Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"detailedError": {
"message": "Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"code": "MAP_MATCHING_FAILURE"
}
}
]
],
"summary": {
"successfulRoutes": 6,
"totalRoutes": 8
}
}

但是,对于列表中的每个项目,Matrix对象的状态代码可以是200 OK或400。

public class Matrix
{
public int statusCode { get; set; }
public object response { get; set; }
public Detailederror detailedError { get; set; }
}

如果是200,则response对象将是Routesummary

public class Routesummary
{
public int lengthInMeters { get; set; }
public int travelTimeInSeconds { get; set; }
public int trafficDelayInSeconds { get; set; }
public int trafficLengthInMeters { get; set; }
public DateTime departureTime { get; set; }
public DateTime arrivalTime { get; set; }
}

但是,如果是400,response对象将是一个字符串格式的错误消息。

{
"statusCode":400,
"response":"Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"detailedError":{
"message":"Engine error while executing route request: MAP_MATCHING_FAILURE: Origin (0, 0)",
"code":"MAP_MATCHING_FAILURE"
}
}

我使用的是JsonConvert.DeserializeObject<rootobject>,但我遇到的问题是,如果我更改结构以保存Routesummary,400响应的取消序列化将失败——它将是一个字符串。

我不知道如何检查基于JSON的响应代码,然后告诉取消序列化程序根据响应取消序列化到字符串/对象。

我正在调用Azure Maps API(矩阵路由)。

使用此版本的Matrix(将response设置为通用对象的版本)进行取消序列化。

这将允许您在400的情况下获取字符串,在200的情况下获得Routesummary对象,而不会引发任何异常。

public class Matrix
{
public int statusCode { get; set; }
public object response { get; set; }
public Detailederror detailedError { get; set; }
}

一旦取消序列化,请对状态代码进行简单检查;取决于它是否成功,适当地选角。

if (matrix.statusCode is 200) {
var routeSummary = (Routesummary)matrix.Response;
...
}
else {
var errorMessage = (string)matrix.Response;
var detailedError = matrix.detailedError;
...
}

希望这能有所帮助。