C# Refit 在需要类时将 False 反序列化为 Null

C# Refit Deserialize False to Null when expecting Class

提问人:Darrell 提问时间:11/13/2023 最后编辑:Darrell 更新时间:11/13/2023 访问量:67

问:

以下是登录时收到的 2 个 json 响应示例...

对于成功的响应,有效负载是具有 id 和 name 的类

{
    "merchant": "test123",
    "payload": {
        "id": "1234",
        "name": "Test"
    },
    "code": "100",
    "message": "Request successfully executed"
}

...但如果响应不成功,我会收到以下内容......

{
    "merchant": "test123",
    "payload": false,
    "code": "105",
    "message": "Invalid username or password!"
}

我无法控制接收“有效负载”:false。理想情况下,这将是“有效负载”:null

在反序列化响应时,如何将“payload”: false 更改为 “payload”: null?当前在运行时出现异常错误。使用 C# 和 refit。

using System.Text.Json;

namespace Response;

public class ResponseRoot
{
    public string Merchant { get; set; }
    //the value received in the json response needs to become null if the value is false?
    public ResponsePayload? Payload { get; set; }
    public string Code { get; set; }
    public string Message { get; set; }

    public class ResponsePayload
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
}
c# JSON的 。网 json-反序列化 改装

评论

0赞 Felix 11/13/2023
您需要创建将转换为 的自定义转换器。从这里开始,如果您有其他问题,请回来:learn.microsoft.com/en-us/dotnet/standard/serialization/...boolnull
0赞 dbc 11/13/2023
当前在运行时出现异常错误。-- 您能否编辑您的问题以共享异常的完整输出,包括异常类型、消息、回溯和内部异常(如果有)?如果您愿意分享您如何配置和调用 Refit,这也将有助于我们为您提供帮助。从您的问题的标签中可以看出您正在使用,您能否确认并分享您是如何配置它的?最后,您的服务器是否返回错误代码?ToString()SystemTextJsonContentSerializer"payload"false
1赞 Darrell 11/14/2023
@Felix这就是我需要的。谢谢你的链接。
1赞 Darrell 11/14/2023
我使用此链接解决了此问题:stackoverflow.com/questions/60634410/...

答:

0赞 Serge 11/13/2023 #1

您可以先解析

    var jObj = JsonObject.Parse(json);
    if (jObj["payload"].ToString() == "false") jObj["payload"] = null;

    ResponseRoot rb = System.Text.Json.JsonSerializer.Deserialize<ResponseRoot>(jObj, new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    });

如果您有时间和愿望,可以将此代码包装在函数或自定义 JSON 转换器中。

评论

0赞 Darrell 11/13/2023
嗨,塞尔。感谢您的建议,但您知道这是否可通过改装来实现吗?感谢
0赞 Serge 11/13/2023
尝试使用 JObject 类而不是 ResponseRoot,并让我知道它是否有效