【问题标题】:Deserialize JSON and assert response反序列化 JSON 并断言响应
【发布时间】:2021-06-02 10:25:19
【问题描述】:

基本上我正在尝试编写一个测试来反序列化对 Customer 对象的 JSON 响应并断言 Firstname 是“Darron”

JSON 对象

  {
        "Id": 615,
        "Customer": {
            "Id": 726,
            "MemberNodeId": 2257,
            "EmailAddress": "Darron_Lips@email.com",
            "Deleted": false,
            "LastModifiedBy": "CUSTOMER",
            "LastModifiedOn": "2021-06-02T08:54:38.243Z",
            "CreatedBy": "CUSTOMER",
            "CreatedOn": "2021-06-02T08:54:38.243Z"
        },
        "Title": {
            "Id": 1,
            "Title": "Mr"
        },
        "Firstname": "Darron",
        "Lastname": "Lips",
        "Gender": "Male",
        "DateOfBirth": "1977-11-21T00:00:00Z",
        "Height": 241.000000000,
        "Weight": 204.000000000,
        "LastModifiedBy": "CUSTOMER",
        "LastModifiedOn": "2021-06-02T08:54:38.257Z",
        "CreatedBy": "CUSTOMER",
        "CreatedOn": "2021-06-02T08:54:38.257Z"
    }
]

客户模型

   public class Customer
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("MemberNodeId")]
        public int MemberNodeId { get; set; }

        [JsonProperty("EmailAddress")]
        public string EmailAddress { get; set; }

        [JsonProperty("Deleted")]
        public bool Deleted { get; set; }

        [JsonProperty("LastModifiedBy")]
        public string LastModifiedBy { get; set; }

        [JsonProperty("LastModifiedOn")]
        public DateTime LastModifiedOn { get; set; }

        [JsonProperty("CreatedBy")]
        public string CreatedBy { get; set; }

        [JsonProperty("CreatedOn")]
        public DateTime CreatedOn { get; set; }
    }

    public class CustomerTitle
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("Title")]
        public string Title { get; set; }
    }

    public class Root
    {
        [JsonProperty("Id")]
        public int Id { get; set; }

        [JsonProperty("Customer")]
        public Customer Customer { get; set; }

        [JsonProperty("Title")]
        public string Title { get; set; }

        [JsonProperty("Firstname")]
        public string Firstname { get; set; }

        [JsonProperty("Lastname")]
        public string Lastname { get; set; }

        [JsonProperty("Gender")]
        public string Gender { get; set; }

        [JsonProperty("DateOfBirth")]
        public DateTime DateOfBirth { get; set; }

        [JsonProperty("Height")]
        public int Height { get; set; }

        [JsonProperty("Weight")]
        public int Weight { get; set; }

        [JsonProperty("LastModifiedBy")]
        public object LastModifiedBy { get; set; }

        [JsonProperty("LastModifiedOn")]
        public DateTime LastModifiedOn { get; set; }

        [JsonProperty("CreatedBy")]
        public string CreatedBy { get; set; }

        [JsonProperty("CreatedOn")]
        public DateTime CreatedOn { get; set; }
    }

}

和测试

  [Test]
        public void CanGetCustomerDetails()
        {
            RestClient client = new RestClient(baseUrl);
            RestRequest request = new RestRequest("CustomerDetailsApi/GetAll", Method.GET);
            request.AddHeader("Authorization", $"Bearer {token}");
            IRestResponse response = client.Execute(request);

       
        }

到目前为止我已经尝试过

  var customer = client.Execute(request).Content;
        var responsea = JsonConvert.DeserializeObject<List<Customer>>(customer);
        Assert.AreEqual(responsea, "firstname");

   var customer = client.Execute(request).Content;
            var responsea = JsonConvert.DeserializeObject<Customer>(customer);

导致:

"Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型"

【问题讨论】:

  • 您的示例 json 缺少开头 [,这是 C+P 错误,还是您的 json 真的像那样?
  • 从异常报错看来是题型错字。
  • 您的 JSON 与您的课程不匹配。首先,您应该反序列化为List&lt;Root&gt;,但您还需要修改该类以具有Title 属性的子类。此外,身高和体重的这些数字不能反序列化为 int 属性。
  • 您是否尝试反序列化根对象列表?您会发现其他错误,例如将属性 Title 定义为字符串而不是 CustomerTitle 以及一些无法分配给整数(宽度/高度)但反序列化有效的值,您可以使用该列表来检查 firstname 属性
  • @DavidG 它没有,很好发现谢谢

标签: c# json json.net


【解决方案1】:

您的 JSON 与您的课程不匹配。首先,您应该反序列化为List&lt;Root&gt;,但您还需要修改该类以具有Title 属性的子类。此外,身高和体重的这些数字不能反序列化为 int 属性。

首先,是你的Root 类:

public class Root
{
    public int Id { get; set; }
    public Customer Customer { get; set; }
    public CustomerTitle Title { get; set; } // Correct type used here
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Gender { get; set; }
    public DateTime DateOfBirth { get; set; }
    public double Height { get; set; } // double rather than int
    public double Weight { get; set; } // double rather than int
    public object LastModifiedBy { get; set; }
    public DateTime LastModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime CreatedOn { get; set; }
}

现在反序列化为正确的类型:

var responsea = JsonConvert.DeserializeObject<List<Root>>(customer);

现在你可以这样断言:

Assert.AreEqual(responsea[0].Firstname, "Darron");

请注意,如果属性名称已经匹配,则不需要所有 JsonProperty 属性。

【讨论】:

  • 如果这个答案对你有用,那么你应该接受它。见How does accepting an answer works
  • 这种方法要非常小心!它看起来“有效”并且经受住了时间的考验是 2 个不同的要求。
  • @JᴀʏMᴇᴇ 这种方法到底有什么问题?
  • 您使用过Assert.AreEqual,您真的认为这是最好的选择,还是只是为您节省时间?语法的疯狂选择。
  • @JᴀʏMᴇᴇ 好吧,我用它是因为 OP 用了它,但你为什么认为它这么糟糕?
【解决方案2】:

试试这个:

  var customer = client.Execute(request).Content;
        var responsea = JsonConvert.DeserializeObject<List<Root>>(customer);
        Assert.AreEqual(responsea[0].Firstname , "Darron");

本质上是responsea[0].Firstname 访问List 的第一个元素,获取它的Firstname 属性并用值断言,这似乎是"Darron"

您的第二次尝试,本质上是尝试将整个数组转换为一个引发异常的对象。

此外,您有一些声明的类型与您的 JSON 不匹配。

【讨论】:

  • 问题在于反序列化,而你的与他已经尝试过的相匹配。
  • 第一次尝试不会引发异常,只有第二次会引发异常,尽管我使用列表中的 Root 而不是客户更新了答案。
  • 感谢大家的贡献,我已经用上面的例子让它工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2018-03-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多