首页 > 解决方案 > Newtonsoft JsonConvert.DeserializeObject 将非空可枚举属性反序列化为 null

问题描述

我正在创建一个集成测试来验证一个 REST API。一切都按预期发生。但是当我试图反序列化响应的内容时,一个 IEnumerable 类型的属性没有填充字符串 json 中存在的值。

请参阅下面的部分测试代码:

var inputValue = new List<InputValueType> {
    new InputValueType()
};
var request = new HttpRequestMessage(new HttpMethod("POST"), "/api/endpoint")
{
    Content = new StringContent(
        Newtonsoft.Json.JsonConvert.SerializeObject(inputValue),
        Encoding.UTF8,
        MediaTypeNames.Application.Json
    )
};
var response = await _client.SendAsync(request);
var contentString = await response.Content.ReadAsStringAsync();
var content = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseValueType>(contentString);

内容字符串是

{
    "status": "ERRO",
    "codigo": "400",
    "descricao": "Quantidade de Registros não processados: 1",
    "folhas": [
        {
        "tpInscEmpregador": null,
        "nrInscEmpregador": null,
        "tpInscEstabelecimento": null,
        "nrInscEstabelecimento": null,
        "matricula": null,
        "cpf": null,
        "idFolha": null,
        "tpFolha": null,
        "erro": "CPF,TpInscEmpregador,NrInscEmpregador,Matricula,IdFolha,IdFolhaPai,TpFolha,CargoCodigo,CargoNome,LotacaoCodigo,LotacaoNome,TpInscEstabelecimento,NrInscEstabelecimento,AnoMes,DataPagamento,DataInicial,DataFinal,Periodicidade,ValorProventos,ValorDescontos,ValorLiquido,SalarioContratual,BaseCalculoINSS,BaseCalculoFGTS,BaseCalculoIRRF,SaldoFGTS,ValorMargem,FGTS,FGTSContSocial,Rubricas"
        }
    ]
}

响应值类型是

public class ResponseValueType
{
    public string Status { get; set; }
    public string Codigo { get; set; }
    public string Descricao { get; set; }
    public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; }

    public ResponseValueType()
    {
        Status = "OK";
        Codigo = "200";
        Descricao = "Sucesso";
    }

    public ResponseValueType(string status, string codigo, string descricao)
    {
        Status = status;
        Codigo = codigo;
        Descricao = descricao;
    }

    public ResponseValueType(string status, string codigo, string descricao, IEnumerable<ResponseValueTypeErro> errors)
        : this(status, codigo, descricao)
    {
        Folhas = errors.ToList();
    }
}

public class ResponseValueTypeErro
{
    public string TpInscEmpregador { get; set; }
    public string NrInscEmpregador { get; set; }
    public string TpInscEstabelecimento { get; set; }
    public string NrInscEstabelecimento { get; set; }
    public string Matricula { get; set; }
    public string CPF { get; set; }
    public string IdFolha { get; set; }
    public string TpFolha { get; set; }
    public string Erro { get; set; }
}

但是,当 contentString 被反序列化时,与属性 Folhas 保持一致的内容等于 null。

我该怎么做才能正确反序列化 Folhas 属性?

标签: c#json.net

解决方案


该物业也只需要一套。代码可以改变它:

public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; }

对它:

public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; set; }

推荐阅读