c# - 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 属性?
解决方案
该物业也只需要一套。代码可以改变它:
public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; }
对它:
public virtual IEnumerable<ResponseValueTypeErro> Folhas { get; set; }
推荐阅读
- r - adabag 和 rpart 的区别
- android - 视频聊天服务器(通过手动代码) - Android
- node.js - sequlize js/express js/node js如何更改日期格式
- c# - Azure eventthub 捕获回放
- reactjs - 将道具传递给无状态组件样式(css)
- java - 类在 CompletableFuture 中未正确加载
- java - 解析格式化的日期在 Java 11 中给出 null 但在 Java 8 中给出正确的输出
- ios - 我在从 google api 查找路由时遇到问题,它显示,此 IP、站点或移动应用程序无权使用此 API 密钥
- stripe-payments - Stripe 增加了不可发货产品的运费
- java - 我有一个有头有尾的队列。如何使 tail 不是队列中的下一个节点进入?