2017-07-14 43 views
-2

我所拥有的是一个JSON格式的REST响应,看起来像这样:{ "guid": "c75d06a8-a705-48ec-b6b3-9076becf20f4" }反序列化JSON对象转换类型的System.Guid

当尝试反序列化这个效应初探字符串转换类型的对象的System.Guid这样的:Newtonsoft.Json.JsonConvert.DeserializeObject(response.content, type); ,以下抛出异常:

无法反序列化当前JSON对象(例如{“名称”:“值”})成型“System.Nullable`1 [的System.Guid]”,因为类型要求JSON原始值(例如,字符串,数字,布尔值,空值)以正确反序列化。 要修复此错误,请将JSON更改为JSON原始值(例如,字符串,数字,布尔值,空值)或更改反序列化类型,以使其成为正常的.NET类型(例如,不是像整数这样的基本类型,也不是集合类型如数组或列表),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。 Path'guid',line 1,position 8.

任何帮助表示赞赏!

+3

错误告诉你为什么它不工作:你试图反序列化' {“guid”:“guid”}作为“Guid”。 'Guid'类型没有'guid'属性。反序列化对象,然后将'guid'属性的*值*反序列化为'Guid'。 –

+1

您可以从字符串值创建新的GUID,如错误指示。当你提取这个字符串时,试试'new Guid(myGuidString)' – Sal

回答

4

如果你不想创建一个类只包含的GUID值,你可以使用一个动态变量:

string json = "{ \"guid\": \"c75d06a8-a705-48ec-b6b3-9076becf20f4\" }"; 
dynamic container = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json); 
Guid guid; 
Guid.TryParse(container.guid.ToString(), out guid); 
Console.WriteLine(guid);  
// c75d06a8-a705-48ec-b6b3-9076becf20f4 
0

自从我做了这种类型的事情之后,有点过了,但我认为答案出现在您的错误消息中。让它回来作为字符串。在你的类中覆盖guid字符串属性来设置另一个GUID类型的属性,并在那里执行你的转换和错误处理。另一种方法是使用构造函数来帮助这里。希望这给你一个方向。