我正在使用一个由PHP内部web开发人员编写的API。我正在用c#编写一个应用程序,使用JSON.net来反序列化json。该API用于从数据库检索客户信息。如果用户存在,返回的json是
{
"success": true,
"id": "21",
"msg": "",
"info": {
"FirstName": "name",
"LastName": "name",
}
}
它被反序列化成这样的类
public class Json
{
public bool Success { get; set; }
public object Id { get; set; }
public string Msg { get; set; }
public Info Info { get; set; }
}
public class Info
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
这个工作很好。
否则,如果用户不存在,那么我收到这个
{
"success": false,
"id": false,
"msg": "User does not exists in databse",
"info": false
}
如果我试图反序列化它,那么我得到
{"Error converting value False to type 'Info'. Path 'info', line 1, position 79."}
是否有办法获得第二个json类型反序列化到相同的类没有这个错误,或者我需要为不同的json.
Rob的评论是正确的,因为这是糟糕的API设计,如果什么都不存在,info
应该返回null
。
如果这超出了您的控制范围,但是,您可以使用自定义JsonConverter
来检查info
的类型是否为bool
并返回null
,但是反序列化为正常。
public class InfoConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader.TokenType == JsonToken.Boolean ? null : serializer.Deserialize(reader, objectType);
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
要触发转换器,只需将JsonConverter
属性添加到Info
属性:
[JsonConverter(typeof(InfoConverter))]
public Info Info
{
get;
set;
}
这将在反序列化时自动执行转换器,检查输入类型是否为布尔值,如果是则返回null,否则反序列化。
这是假设在info
中接收到的任何bool值都意味着用户不存在。如果不是这种情况,只需根据需要更新ReadJson
方法。
我目前没有编译器,所以我不能检查它,但也许你可以添加一个隐式转换操作符到Info
:
public class Info
{
public string FirstName { get; set; }
public string LastName { get; set; }
public static implicit operator Info(bool b)
{
return null;
}
}