0

我有一个非常奇怪的情况,我发现无法解决,因此非常感谢任何指导。

我正在通过他们的 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 相比,将字符串复制到上面的有效负载变量没有区别...

任何人都可以提供对此的任何见解吗?

4

1 回答 1

0

@Fildor 用他的一条评论为我指出了正确的方向,他说如果相同的输入产生不同的结果,则必须破坏 lib。事实上,问题出在正在使用的 Nuget 包上——尽管它们已自动更新,但它们的版本不同。我将两者都更新到了最新版本,这解决了主应用程序中的问题。

似乎在最新版本的 lib 中引入了一个错误,该错误已在最新版本中修复。当两者都更新到最新版本时,两者都返回了正确的结果。

于 2020-12-10T06:53:53.743 回答