代码之家  ›  专栏  ›  技术社区  ›  Ivan-Mark Debono

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

  •  2
  • Ivan-Mark Debono  · 技术社区  · 6 年前

    BadRequest 内容可以是三种不同类型的异常之一(继承自 Exception

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

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

    但我怎样才能得到我需要的确切类型呢?

    2 回复  |  直到 6 年前
        1
  •  0
  •   derpirscher    6 年前

    我假设您在服务器端执行了JSON序列化,如下所示

    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);
    

    编辑

    switch (exJson.Value<string>("ClassName")) {
        case "your.namespace.SomeExceptionType":
            {
                SomeExceptionType ex = exJson.ToObject<SomeExceptionType>();
            }
            break;
        case "your.namespace.OtherExceptionType":
            {
                OtherExceptionType ex = exJson.ToObject<OtherExceptionType>();
            }
            break;
        default:
            {
                Exception ex = exJson.ToObject<Exception>();
            }
            break;
        }
    
        2
  •  0
  •   Prasanjeet Debnath    6 年前

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

    如果你分析这一行

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

    它将从JSON解析到对象类。

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

        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()
    }