我有一个非常奇怪的情况,我发现无法解决,因此非常感谢任何指导。
我正在通过他们的 API 从 HMRC 检索增值税号搜索的结果,并将其作为有效的 JSON 返回。但是,当我在实时应用程序中执行此操作时,没有设置其中一个属性及其自身的属性,但是如果我调试应用程序并将返回的 JSON 值复制到单元测试中,它会完全反序列化 - 但代码和值在两种情况下都是相同的。多年来,我一直在用 API 的其他部分做这种事情,只有这个结果才有问题。
我正在使用 fastJSON 将返回的 JSON 反序列化为一个简单的 POCO 对象:
public class VatNumberValidationResult
{
#region Properties
// ReSharper disable InconsistentNaming
public string consultationNumber { get; set; }
public DateTime? processingDate { get; set; }
public string requester { get; set; }
public VatTarget target { get; set; }
// ReSharper restore InconsistentNaming
#endregion
#region Constructors
public VatNumberValidationResult()
{
Initialise();
}
#endregion
#region Methods
private void Initialise()
{
consultationNumber = string.Empty;
processingDate = null;
requester = string.Empty;
target = new VatTarget();
}
#endregion
}
public class VatTarget
{
#region Properties
// ReSharper disable InconsistentNaming
public string name { get; set; }
public string vatNumber { get; set; }
public VatValidationAddress address { get; set; }
// ReSharper restore InconsistentNaming
#endregion
#region Constructors
public VatTarget()
{
Initialise();
}
#endregion
#region Methods
private void Initialise()
{
name = string.Empty;
vatNumber = string.Empty;
address = new VatValidationAddress();
}
#endregion
}
public class VatValidationAddress
{
#region Properties
// ReSharper disable InconsistentNaming
public string countryCode { get; set; }
public string line1 { get; set; }
public string line2{ get; set; }
public string line3{ get; set; }
public string postcode { get; set; }
// ReSharper restore InconsistentNaming
#endregion
#region Constructors
public VatValidationAddress()
{
Initialise();
}
#endregion
#region Methods
private void Initialise()
{
countryCode = string.Empty;
line1 = string.Empty;
line2 = string.Empty;
line3 = string.Empty;
postcode = string.Empty;
}
#endregion
}
这是单元测试代码的示例:
[TestMethod]
public void ToObject_ValidHmrcJson2_ReturnsValidObject()
{
var payload = "{\"target\":{\"name\":\"EVERGREEN LIMITED\",\"vatNumber\":\"123926622\",\"address\":{\"line1\":\"BIG HOUSE\",\"line2\":\"160 EVERGREEN ROAD\",\"line3\":\"LONDON\",\"postcode\":\"NW1 2XX\",\"countryCode\":\"GB\"}},\"requester\":\"806970609\",\"consultationNumber\":\"VMn-pts-mWB\",\"processingDate\":\"2020-12-08T08:18:36.546Z[Europe/London]\"}";
var result = fastJSON.JSON.ToObject<VatNumberValidationResult>(payload);
Assert.IsNotNull(result);
}
每次都会通过,无论传递的数据如何,即我已经尝试过大量不同的公司,并且每次都返回正确的信息。
这是实时代码,实际上是相同的:
.....
var payLoad = postResult.Payload;
var fastJsonResult = fastJSON.JSON.ToObject<VatNumberValidationResult>(payLoad);
.....
有效负载的值是复制并传输到单元测试的 JSON。运行这个实际上相同的代码的结果是 target 属性为空:
result = {Synergy.MtdVatModule.Model.VatNumberValidationResult}
consultationNumber = "VMn-pts-mWB"
processingDate = {08/12/2020 08:18:36}
requester = "806970609"
target = {Synergy.MtdVatModule.Model.VatTarget}
address = {Synergy.MtdVatModule.Model.VatValidationAddress}
countryCode = ""
line1 = ""
line2 = ""
line3 = ""
postcode = ""
name = ""
vatNumber = ""
而当它作为单元测试的一部分完成时,它每次都能完美运行:
result = {Synergy.MtdVatModule.Model.VatNumberValidationResult}
consultationNumber = "VMn-pts-mWB"
processingDate = {08/12/2020 08:18:36}
requester = "806970609"
target = {Synergy.MtdVatModule.Model.VatTarget}
address = {Synergy.MtdVatModule.Model.VatValidationAddress}
countryCode = "GB"
line1 = "BIG HOUSE"
line2 = "160 EVERGREEN ROAD"
line3 = "LONDON"
postcode = "NW1 2XX"
name = "EVERGREEN LIMITED"
vatNumber = "123926622"
我唯一能想到的是,在处理之前将 JSON 保存到文本中是有区别的,但由于它已经是一个有效的 JSON 字符串,我看不出它是怎么回事。与进行相同的调用并传递 postResult.Payload 相比,将字符串复制到上面的有效负载变量没有区别...
任何人都可以提供对此的任何见解吗?