如何用JSON反序列化JSON.. NET转换错误



我正在使用一个由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;
    }
}

相关内容

  • 没有找到相关文章

最新更新