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