即使 JsonSerializer 工作,改装响应为空

Posted

技术标签:

【中文标题】即使 JsonSerializer 工作,改装响应为空【英文标题】:Refit response is null even though JsonSerializer works 【发布时间】:2021-09-13 11:55:02 【问题描述】:

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

【问题讨论】:

您确定您定义的 Rootobject 类结构已更新以说明您提到的响应的更改吗?我能够根据您提供的详细信息在本地拼凑一个快速项目,并且反序列化似乎按预期工作。 @mreyeros 我确实使用 VC2019 “将 JSON 粘贴为类”功能生成了这些类,以确保它们适合。 @mreyeros 没关系,找出问题所在。 【参考方案1】:

没关系,我发现了问题。我忘记了管理员帐户没有分配给它的公司,因此使用该帐户登录并检索返回的数据为空。在 Postman 上,我使用的是专门用于测试的用户帐户,该帐户确实分配了一家公司,因此响应按预期出现。我将向我的 API 发出警告,以防我未来的自己再次这样做。

换句话说,这是一个经典的 PEBKaC。

【讨论】:

以上是关于即使 JsonSerializer 工作,改装响应为空的主要内容,如果未能解决你的问题,请参考以下文章

JsonSerializer 尝试 DeserializeFromString

C# ServiceStack JsonSerializer 反序列化

Owl carousel 2 即使在使用 responsiveclass true 后也无法在响应模式下工作

联想Y50用U盘改装win7的详细教程

Faye:即使套接字打开,也无法在浏览器中发送 GET 消息,通过 CURL 工作和响应数据

JsonSerializer.Deserialize 无法推断用法