将 JSON 对象反序列化为 System.Guid 类型

Wal*_*ari -1 c# json json.net deserialization

我拥有的是 JSON 格式的 REST 响应,如下所示:{ "guid": "c75d06a8-a705-48ec-b6b3-9076becf20f4" }

当尝试将此响应字符串反序列化为 System.Guid 类型的对象时,如下所示:Newtonsoft.Json.JsonConvert.DeserializeObject(response.content, type);,引发以下异常:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“System.Nullable`1[System.Guid]”,因为该类型需要 JSON 原始值(例如字符串、数字、布尔值、空值)正确反序列化。要修复此错误,请将 JSON 更改为 JSON 原始值(例如字符串、数字、布尔值、空值)或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是集合类型)可以从 JSON 对象反序列化的数组或列表)。还可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。路径“guid”,第 1 行,位置 8。

任何帮助表示赞赏!

stu*_*rtd 5

如果您不想创建一个仅包含 Guid 值的类,您可以直接从解析的 Json 中解析该值:

string json = "{ \"guid\": \"c75d06a8-a705-48ec-b6b3-9076becf20f4\" }";
var container = JToken.Parse(json);
Guid guid;
if (Guid.TryParse(container["guid"]?.ToString(), out guid))
{
    Console.WriteLine(guid);    
}
else{
    Console.WriteLine("No guid present or it has an invalid format");
}
// c75d06a8-a705-48ec-b6b3-9076becf20f4
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用动态变量,但我个人认为这不是动态的一个很好的用例:

string json = "{ \"guid\": \"c75d06a8-a705-48ec-b6b3-9076becf20f4\" }";
dynamic container = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
Guid guid;
if (Guid.TryParse(container.guid?.ToString(), out guid)) {
    Console.WriteLine(guid);
}
else {
    Console.WriteLine("No guid present or it has an invalid format");
}
// c75d06a8-a705-48ec-b6b3-9076becf20f4
Run Code Online (Sandbox Code Playgroud)