使用RestSharp反序列化JSON字符串

53

我有一个从数据库中获取的字符串,它是Json格式的。

我尝试使用以下方法反序列化它:

RestSharp.Deserializers.JsonDeserializer deserial = new JsonDeserializer();
var x = deserial .Deserialize<Customer>(myStringFromDB)

但是.Deserialize函数期望的是一个IRestResponse对象。

是否有一种方法可以使用RestSharp仅将原始字符串反序列化?


1
我感同身受 - Andy
2个回答

73
有几种方法可以实现这一点。一个非常流行的处理json的库是Newtonsoft.Json。可能你已经在你的asp.net项目中使用了它,但如果没有,你可以从nuget添加它。
考虑到你有一个响应对象,包括以下命名空间并从JsonConvert类中调用静态方法DeserializeObject<T>:
using Newtonsoft.Json;
using RestSharp;

return JsonConvert.DeserializeObject<T>(response.Content);

response.Content 中,你将得到原始结果,只需将此字符串反序列化为 JSON 对象。在这种情况下,T 是你需要反序列化的类型。

例如:

var customerDto = JsonConvert.DeserializeObject<CustomerDto>(response.Content);

更新

最近,微软在 .Net 平台上添加了一个命名空间 System.Text.Json,用于处理 json 格式。您可以通过调用 JsonSerializer.Deserialize<T> 静态方法来使用它:

using System.Text.Json;

var customer = JsonSerializer.Deserialize<Customer>(jsonContent);

4
RestSharp的序列化程序和反序列化程序是问题所在。使用Newtonsoft之后,问题消失了。 - Ian Vink
1
@BahaiResearch.com 这并不是说 RestSharp 的序列化/反序列化本身有问题;只是它没有你需要的功能,因为 RestSharp 是一个 HTTP 客户端库,而不是一个通用的序列化工具。正如你所指出的,它需要一个 IRestResponse,而不是像支持 IRestResponse.Content(string 类型)一样。下面 StevieJ81 提出了一个潜在的解决方法,如果出于某种原因你想要或必须使用 RestSharp 进行 JSON 反序列化,他直接使用了 IRestResponse.Content。 - Matthew
在 .NET 6 LTS 中使用原生的 System.Text.Json,效果非常棒。 - k_rollo

58

如果您想避免使用额外的库,可以尝试以下方法:

RestSharp.RestResponse response = new RestSharp.RestResponse();

response.Content = myStringFromDB; 

RestSharp.Deserializers.JsonDeserializer deserial = new JsonDeserializer();

Customer x = deserial.Deserialize<Customer>(response);

注意事项:未经广泛测试,但似乎工作得足够好。


非常好用。这样我就少了一个要在我的应用程序中包含的库。 - Brad Bruce
9
在我使用的 RestSharp 版本中,JsonDeserializer 类似乎已经被移动到 RestSharp.Serialization.Json.JsonDeserializer。 - Michael
我认为这个不再有效,至少对于版本“100.6.10”。 - Esteban Verbel
2
在我的情况下,RestSharp 反序列化器比 Newtonsoft 反序列化器更好地处理了 JSON 内容中的奇特对象名称,因此这是不必为此再包含另一个库的另一个论据。 - Alexis Leclerc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接