【问题标题】:Json Deseralizer cannot convert string to guidJson Deseralizer 无法将字符串转换为 guid
【发布时间】:2021-04-01 12:05:05
【问题描述】:

我目前处于项目的集成测试阶段,在尝试测试端点以查看我的数据库是否返回某些任务时遇到了错误。 我的域对象如下所示:

public class Task
    {
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }

        [Column(TypeName = "decimal(18,2)")] 
        public decimal? InitialPrice { get; set; }
    }

我的端点基本测试代码

[Fact]
        public async Task Should_return_All_Tasks_with_ok_statusCode()
        {
            client.SetFakeBearerToken((object) token);
            
            var response = await client.GetAsync("/api/v1/tasks");

            response.StatusCode.Should().Be(HttpStatusCode.OK);
            var json = await response.Content.ReadAsStringAsync();
            var data = JsonConvert.DeserializeObject<List<Task>>(json);
            data.Count.Should().BeGreaterThan(0);
        }

当我运行测试时,我得到了错误

Newtonsoft.Json.JsonReaderException: Could not convert string to integer: 64fa643f-2d35-46e7-b3f8-31fa673d719b. Path '[0].id', line 1, position 45.

我也尝试过使用 webapi.client 包中的 ReadAsAsync() 方法,但仍然遇到同样的错误。

对我试图测试的端点的 api 调用会给出:

[
  {
    "id": "64fa643f-2d35-46e7-b3f8-31fa673d719b",
    "title": "Garden Trimming in Lagos Ajah",
    "description": "Please my garden needs trimmin, Im in lagos",
    "initialPrice": 20.3
  }
]

非常感谢您的帮助

【问题讨论】:

  • 我有一些代码运行最新版本的 Newtonsoft (12),它反序列化 Guids 就好了。您使用的是旧版本的 NS 吗?
  • 我看不出你的代码有什么问题,看起来它应该可以正常工作。这可能是 Json.NET 中的一个错误:github.com/dotnet/orleans/issues/1187
  • @BryanLewis 嗨,感谢您的意见,是的,我正在运行最新版本

标签: c# asp.net-web-api .net-core json.net


【解决方案1】:

您将 Task 类命名为与 .Net 框架中的 System.Threading.Tasks.Task 对象相同。 System.Threading.Tasks.Task 有一个 int Id 属性。您要反序列化的代码实际上是在尝试将您的 JSON 反序列化为 System.Threading.Tasks.Task 对象。

要解决此问题,您需要重命名 Task 类,我建议这样做,或者在调用 JsonConvert.DeserializeObject 的代码行中指定 Task 对象的全名,包括命名空间。

【讨论】:

  • 你先生是上帝派来的。那正是错的!我现在觉得很笨。非常感谢这个
  • 很高兴为您提供帮助,而且您不是第一个犯此错误的人。
  • 真的很棒@quaabaam :)
  • 在遇到类似的奇怪问题之前,我实际上已经命名了一个类任务。我应该意识到这一点。好叫 quaabaam。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多