如何确定反序列化json字符串的类型?

时间:2018-08-12 05:17:23

标签: c# asp.net-web-api json.net

我有一个WebApi,它返回一个BadRequest,内容可以是3种不同类型的异常之一(从Exception继承)。

客户端必须确定它是哪种异常类型并相应地对其进行处理。目前我正在做:

if (response.StatusCode == HttpStatusCode.BadRequest)
{
    var ex = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
}

但是如何获得所需的确切类型?

2 个答案:

答案 0 :(得分:0)

我从您的问题中了解到的是,从Api您将获得Http状态代码BadRequest,其结果将包含从Exception类继承的C#Exception。

如果您分析此行

var ex = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);

它将从JSON解析为Object类。 但是内容将是从Web api抛出的异常,因此您无法将内容解析为Exception对象。

检查字符串是否包含的更好方法

    String res= response.Content.ReadAsStringAsync().Result.toString();
    if(res.Contains("Type1Exeption")){
    throw new Type1Exception()
    }
else if(res.Contains("Type2Exeption")){
    throw new Type2Exception()
    }
else{
throw new Type3Exception()
}

答案 1 :(得分:0)

我假设您是这样在服务器端进行JSON序列化的

ndk 11

然后您的结果对象将看起来像这样

try {
....
catch (SomeExceptionType ex)
    var resultbody = JsonConvert.SerializeObject(ex);
}

由此您可以还原异常

{
  "ClassName": "your.namespace.SomeExceptionType",
  "Message": "foo bar",
  "Data": null,
  "InnerException": null,
  "HelpURL": null,
  "StackTraceString": null,
  "RemoteStackTraceString": null,
  "RemoteStackIndex": 0,
  "ExceptionMethod": null,
  "HResult": -2146233088,
  "Source": null,
  "WatsonBuckets": null
}

编辑

如果异常类型的可能性范围有限,那么您当然也可以这样做

JObject exJson = JsonConvert.DeserializeObject<JObject>(exString);
Type t = Type.GetType(exJson.Value<string>("ClassName"));
var ex = exJson.ToObject(t);