【问题标题】:Newtonsoft JsonConvert.DeserializeObject deserialize a not empty enumerable property as nullNewtonsoft JsonConvert.DeserializeObject 将非空可枚举属性反序列化为 null
【发布时间】:2020-11-19 05:02:20
【问题描述】:

我正在创建一个集成测试来验证一个 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"
        }
    ]
}

ResponseValueType 是

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 属性?

【问题讨论】:

  • 错字?错误的类名?
  • IEnumerable&lt;ResponseValueType&gt; Folhas { get; } -> IEnumerable&lt;ResponseValueTypeErro&gt; Folhas { get; }?
  • @GuruStron...对不起!我已经更正了帖子......类型相同。
  • @GuruStron .... 你让我看到了我的错误。我只需要将设置选项设置为属性 Folhas
  • @GeanRibeiro 我没有提供答案,所以我很好)

标签: c# json.net


【解决方案1】:

该属性也只需要一个集合。代码可以改变它:

public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; }

给它:

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

【讨论】:

  • 或者,如果您预先分配Folhas,它将被填充:public virtual IEnumerable&lt;ResponseValueTypeErro&gt; Folhas { get; } = new List&lt;ResponseValueTypeErro&gt;();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多