问题描述
我在反序列化 json 响应时遇到问题。我正在使用 Refit c# 库与 API 进行通信。即使正确加载了测试字段,响应中的 RootObject.company 也始终为空。我还尝试通过 Postman 检索 JSON 字符串并手动反序列化它以查看是否会出现问题,但它按预期工作。我很难过可能会出什么问题。相同的代码以前确实适用于公司列表,但设计发生了变化,现在只返回一个公司。请忽略登录部分,它仅用于身份验证到我的本地开发后端。我为我的问题创建了一个最低限度的工作示例:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var ApiIlogin = RestService.For<IMyInterface>("http://localhost:8000");
var login = ApiIlogin.Login("admin","admin").Result;
var result = ApiIlogin.GetData(login.Token).Result;
var myString =
"{\"company\":{\"id\":1,\"name\":\"TestComp\",\"farms\":[{\"id\":1,\"name\":\"TestFarm1\",\"cameras\":[{\"id\":1,\"name\":\"FakeCamera\",\"ipAddress\":\"127.0.0.1\",\"farm\":1,\"port\":8666,\"count\":[],\"weight\":[],\"area\":null}],\"company\":1},{\"id\":3,\"name\":\"TestFarm3\",\"cameras\":[],\"company\":1}]},\"test\":\"Test\"}";
var test = JsonSerializer.Deserialize<Rootobject>(myString);
}
}
public interface IMyInterface
{
[Get("/api/data")]
Task<Rootobject> GetData([Authorize] string token);
[Post("/api/login?username={username}&password={password}")]
Task<LoginUserResponse> Login(string username,string password);
}
public class LoginUserResponse
{
[JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
public int Id { get; set; }
public string Username { get; set; }
public IList<string> Roles { get; set; }
public string Token { get; set; }
public bool Authenticated { get; set; }
}
public class Rootobject
{
public Company company { get; set; }
public string test { get; set; }
}
public class Company
{
public int id { get; set; }
public string name { get; set; }
public Farm[] farms { get; set; }
}
public class Farm
{
public int id { get; set; }
public string name { get; set; }
public Camera[] cameras { get; set; }
public int company { get; set; }
}
public class Camera
{
public int id { get; set; }
public string name { get; set; }
public string ipAddress { get; set; }
public int farm { get; set; }
public int port { get; set; }
public object[] count { get; set; }
public object[] weight { get; set; }
public object area { get; set; }
}
这是 Postman 检索到的 JSON 示例,以防万一内联消息有所不同。
{
"company": {
"id": 1,"name": "TestComp","farms": [
{
"id": 1,"name": "TestFarm1","cameras": [
{
"id": 1,"name": "FakeCamera","ipAddress": "127.0.0.1","farm": 1,"port": 8666,"count": [],"weight": [],"area": null
}
],"company": 1
},{
"id": 3,"name": "TestFarm3","cameras": [],"company": 1
}
],"__initializer__": null,"__cloner__": null,"__isInitialized__": true
},"test": "Test"
}
解决方法
没关系,我发现了问题。我忘记了 admin 帐户没有分配给它的公司,因此使用该帐户登录并检索数据返回 null。在 Postman 上,我使用了一个专门用于测试的用户帐户,该帐户确实分配了一家公司,因此响应如期而至。我将向我的 API 发出警告,以防我未来的自己再次这样做。
换句话说,这是一个经典的 PEBKaC。