反序列化时的映射问题

Posted

技术标签:

【中文标题】反序列化时的映射问题【英文标题】:Mapping issue when Deserialising 【发布时间】:2021-12-16 05:01:48 【问题描述】:

我有以下代码:

    using System.Text.Json;
    private async Task<AuditReviewerDelegationDto> GetDelegationAsync()
    
        // TODO: Get current logged in user, pass mdmuseridentifier
        var mdmUserIdentifier = 248113;
        var response = LocalHttpClient.GetAsync(BaseAddress + "api/AuditReviewerDelegation/GetDelegation/" + mdmUserIdentifier).Result;

        response.EnsureSuccessStatusCode();

        var responseContent = await response.Content.ReadAsStringAsync();

        var tt = JsonSerializer.Deserialize<AuditReviewerDelegationDto>(responseContent);
        return tt;
    

我的变量 responseContent 包含我期望的所有数据。但是,当我使用 Deserialize 方法时,我的 tt 变量为空。我相信这是因为 responseContent 上的所有属性都以小写字母开头,但在我的 AuditReviewerDelegationDto 上它们都以大写字母开头。我无法将模型更改为小写。无论如何我可以让反序列化器忽略大小写或将响应对象设置为重新调整骆驼大小写。

【问题讨论】:

这能回答你的问题吗? JSON.NET Case Insensitive Deserialization not working 请see 了解更多信息。 请出示minimal reproducible example,包括您的类定义和完整的JSON 【参考方案1】:

是的,为了忽略您的属性名称的大小写,您只需将JsonSerializerOptions.PropertyNameCaseInsensitive 设置为true。有关更多详细信息,请参阅this page,但以下是代码中的样子:

var options = new JsonSerializerOptions

    PropertyNameCaseInsensitive = true
;
var tt = JsonSerializer.Deserialize<AuditReviewerDelegationDto>(responseContent, options);

但是,如果 tt 本身是 null(而不是 tt 的各个属性是 null),您可能会遇到另一个问题 - 这取决于 responseContent 中的实际文本。

【讨论】:

以上是关于反序列化时的映射问题的主要内容,如果未能解决你的问题,请参考以下文章

反序列化时的 Newtonsoft.JSON 空值

反序列化时的备用属性名称

反序列化json时的异常

使用Java中的Jackson反序列化异常/抛出时的问题

如何避免使用 TCP 进行序列化/反序列化时的跨语言依赖?

在 FromForm 中反序列化 JSON 时的生命周期