JSON.NET - 如果JSON数据与所需类型无关,则抛出异常

时间:2012-07-10 15:21:28

标签: c# .net serialization json.net deserialization

我正在使用JSON网络服务。在任何JSON请求上,Web服务都可以通过错误类型JSON或响应类型进行响应。例如:

{
    "response": "register",
    "error": {
        "@c" : "error",
        "code": "USER_EXISTS",
        "message": ""
    }
}

{
    "response": "register",
    "register": {
        "session": {
            "@c" : "session",
            "userId": "18",
            "sessionId": "ASFT23WETT234QQW"
        }
    }
}

我尝试反序列化的任何响应都与请求有关。例如,当请求是RegisterRequest时,RegisterResponse。

如果响应是错误类型响应,则代码

JsonConvert.DeserializeObject<RegisterResponse> (jsonResponse);

创建了RegisterResponse,包含所有空的poperties值。

如果与JSON字符串和目标类型存在某些不兼容性,如何建议JSON.NET抛出异常?

类定义:

public class Response
{
    public string response { get; set; }

    public Response ()
    { }
}


public class Session
{
    public long userId;
    public string sessionId;

    public Session ()
    { }
}

public class RegisterResponse: Response
{
    public Session session { get; set; }

    public RegisterResponse ()
    {
        session = new Session();
    }
}

public class Error
{
    public string code;
    public string message;

    public Error ()
    {
    }
}

1 个答案:

答案 0 :(得分:1)

这不是直接JSON.NET的包,因为你给它的转换实际上在语义上是完全有效的,你只是给了它不好的数据。最好的办法就是先检查数据。创建一个Error类并通过

转换它
JsonConvert.DeserializeObject<Error> (jsonResponse);

然后测试Error的属性以确保它们是空的,就像你希望的那样。

或者你可以解码你正在寻找的单个Error属性,看看它是否返回null。

 JObject o = JObject.Parse(jsonResponse);
 string error = (string)o["Error"];
 if(string.IsNullOrEmpty(error) == false)
    // bad things going down
 // if you get here it's all good