将Json响应映射到类,使用Restsharp反序列化

4

我正在使用RestSharp来消费一个RESTful webservice。我同时使用内置的JSON反序列化器对响应进行反序列化。 以下是响应内容:

[{"id":"1","latitude":"18.0155848","longitude":"-77.4988293","rating":"1","streetid":"1","username":"joel","verified":"1"},{"id":"2","latitude":"18.0155892","longitude":"-77.498774","rating":"1","streetid":"2","username":"joel","verified":"0"},{"id":"3","latitude":"18.0227736","longitude":"-77.4980039","rating":"1","streetid":"3","username":"joel","verified":"0"}]

这些是它正在映射到的模型。
List<Pothole> list = new List<Pothole>();

 public class Pothole
 {
    //getters and setters for the attributes of Pothole Model
    public long Id { get; set;}
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public double Rating{ get;set;}
    public long StreetId { get; set; }
    public string Username { get; set; }
    public bool Verified { get; set; }
}

然而,当我调用时,数据并未被反序列化。我想知道json响应和类映射之间是否存在问题。我将响应映射到一个坑洼列表,因为返回了一个坑洼对象数组。我检查了HTTP状态码和响应内容,所以数据已经返回,只是反序列化导致了问题。


我猜你遇到了JSON和你要映射的类之间大小写不同的问题... - Paul Sasik
@PaulSasik 是的,这就是我遇到的问题。 - Joel Dean
这些模型/类准确吗? - Joel Dean
你需要匹配JSON变量的大小写。使用id而不是Id等。 - Paul Sasik
3个回答

3

试试这个:

public class Pothole
{
    public string id { get; set; }
    public string latitude { get; set; }
    public string longitude { get; set; }
    public string rating { get; set; }
    public string streetid { get; set; }
    public string username { get; set; }
    public string verified { get; set; }
}

C#是大小写敏感的,因此在填充C#对象时发生的反射将查找名称完全与JSON字符串中相同的属性。

另外,如果您使用的是Visual Studio 2012 SP1,则可以将JSON文本直接粘贴为C#类。非常方便。


1
RestSharp是不区分大小写的,即使大小写不同也可以反序列化,这是它最大的优点。 - Toni Petrina
有没有办法指定它如何反序列化?我不想在我的 C# 对象中遵循 JSON 的小写约定。 - The Muffin Man
@Nick:你是在问Toni还是我?如果是我:不,当前版本不支持。如果是Toni:看看RestSharp库是否可配置。 - Paul Sasik

1
或者你也可以使用:Json2Csharp
generate c# classes from json

0
来晚了但我也想发表一下意见。我正在使用未经修改的 RestSharp.Portable 1.6.2 Xamarin PCL 版本。
我的 JSON 如下:
{"blah":{"iPAddress":"10.1.1.x","cPU":"1 vCPU","dNSName":"blah.blah.com"}}

使用以下类,反序列化不适用于CPU,但适用于DSName和IPAddress。
public class Blah
{
    public string CPU { get; set; }
    public string DNSName { get; set; }
    public string IPAddress { get; set; }
}

然而,如果我将CPU更改为cPU,它可以正常工作。

public class Blah
{
    public string cPU { get; set; }
    public string DNSName { get; set; }
    public string IPAddress { get; set; }
}

感觉像是一个bug,我只是想做出贡献。


我认为您需要为所有属性使用正确的大小写,而不仅仅是 cPU? - Myster

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