使用RESTSharp C#反序列化JSON

时间:2015-03-27 16:09:00

标签: c# json xamarin

我正在尝试在Xamarin应用程序中反序列化JSON。我已经阅读了很多,但仍然有问题,所以,也许有人可以提供帮助:

我的JSON响应是这样的:

{
    "Events":[
            {
                "id":7,
                "name":"show",
                "datefrom":"2012-01-01",
                "timeto":"12:00:00",
                "price":"3",
                "imagen":"null",
                "desc":"rock band playing",
                "info":"Info about tickets",
                "user":1,
                "place":9,
                "dateto":"2013-02-02",
                "timeto":"12:30:00",
                "Eventcategories":[]
            },
            {"id":2, name:...

正如我所读到的,我创建了两个类,一个用于Object(事件),另一个用于JSON响应(EventResponse) 第二个只有一个事件列表:

public class EventResponse
{
    public ObservableCollection<Event> Events { get; set; }
    public EventResponse(){
    }
    }
}

Event类包含JSON返回的所有字段:

private int _id;
        public int id {   
            get { return _id; }
            set {

                _id = value;
                OnPropertyChanged ();
            }
        }

        private string _nombre;
        public string nombre {   
            get { return _nombre; }
            set {
                if (value.Equals (_nombre, StringComparison.Ordinal))
                    return;
                _nombre = value;
                OnPropertyChanged ();
            }
        }...

在此之后,我希望我的应用程序解析这个JSON,但我唯一能得到的是一个包含JSON内容的String。

var client = new RestClient("myip/api/events");
            var request = new RestRequest (Method.GET);
            var asyncHandle = client.ExecuteAsync<EventResponse>(request, response => {
            //Here I see the json result
            string jsonString=response.Content;
            //The same
            Console.WriteLine(response.Content);
            //Nothing is shown here
            Console.WriteLine(response.Data.Events[0].id);
            });

¿有人能给我一些关于如何看到json结果的线索吗? 我想我正在遵循适当的步骤,但经过几个小时我无法达成任何目标。 感谢

3 个答案:

答案 0 :(得分:4)

JSON序列化程序很可能无法反序列化为对象。看起来你正在尝试将VM和DTO组合成一个IMO并不是一个好主意的类。保持DTO尽可能简单。如果您将EventResponse更改为以下代码,那么您可以获取对象吗?

public class Event
{
    public int id { get; set; }
    public string name { get; set; }
    public string datefrom { get; set; }
    public string timeto { get; set; }
    public string price { get; set; }
    public string imagen { get; set; }
    public string desc { get; set; }
    public string info { get; set; }
    public int user { get; set; }
    public int place { get; set; }
    public string dateto { get; set; }
    public List<object> Eventcategories { get; set; }
}

public class EventResponse
{
    public List<Event> Events { get; set; }
}

答案 1 :(得分:2)

您错过了反序列化JSON字符串的最后一步。您可以使用Json.net将字符串反序列化为适当的对象。你可以这样做:

var eventResponse = JsonConvert.DeserializeObject<EventResponse>(jsonString);

以下是Newtonsoft的Json.Net http://www.newtonsoft.com/json

的链接

答案 2 :(得分:2)

这是使用Newtonsoft.Json.dll直接反序列化到特定实体/对象的方法,这是一个非常有用的库,可以从nugget安装。您可以在以下链接中找到更多详细信息:https://www.nuget.org/packages/Newtonsoft.Json/

userData = JsonConvert.DeserializeObject<GRALUserData>(response.Content,
                    new JsonSerializerSettings
                    {
                        PreserveReferencesHandling = PreserveReferencesHandling.Objects
                    });