即使 JsonSerializer 有效

问题描述

我在反序列化 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。