Json Deseralizer 无法将字符串转换为 guid

Posted

技术标签:

【中文标题】Json Deseralizer 无法将字符串转换为 guid【英文标题】:Json Deseralizer cannot convert string to 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 嗨,感谢您的意见,是的,我正在运行最新版本 【参考方案1】:

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

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

【讨论】:

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

以上是关于Json Deseralizer 无法将字符串转换为 guid的主要内容,如果未能解决你的问题,请参考以下文章

JSON 字符串上的 JSON 解析抛出“无法将对象转换为原始值”

C# |从 URL 抓取 JSON 无法将字符串转换为 int

无法访问将 xml 转换为 json

无法将 NSDictionary 值转换为 json

PHP - xml到json转换:“无法将字符串解析为XML”

无法使用 Gson 将包含嵌套 json 数组的 json 转换为等效的 JAVA 类