4

I get a json string from an external web service. I would like to save the events from the events array in my database. How can I get List<FacebookEvents>?

My current attempt doesn't work: List< FacebookEvents > my_obj = JsonConvert.DeserializeObject < FacebookEvents > (jsonString);

Source json:

{
"events": [{
    "id": "163958810691757",
    "name": "3Bridge Records presents inTRANSIT w/ David Kiss, Deep Woods, Eric Shans",
    "coverPicture": "https://scontent.xx.fbcdn.net/t31.0-8/s720x720/13679859_10153862492796325_8533542782240254857_o.jpg",
    "profilePicture": "https://scontent.xx.fbcdn.net/v/t1.0-0/c133.0.200.200/p200x200/13872980_10153862492796325_8533542782240254857_n.jpg?oh=a46813bbf28ad7b8bffb88acd82c7c71&oe=581EF037",
    "description": "Saturday, August 20th.\n\nJoin the 3Bridge Records team for another night of sound and shenanigans - as we send Deep Woods & David Kiss out to Burning Man & belatedly celebrate Slav Ka's debut release on the label - \"Endless\" - out May 14th, featuring a remix by Mr. Shans.\n\nDavid Kiss (House of Yes)\nhttps://soundcloud.com/davidkiss\n\nDeep Woods (3Bridge Records)\nhttps://soundcloud.com/deep-woods\n\nEric Shans (3Bridge Records)\nhttps://soundcloud.com/eric-shans\n\nSlav Ka (3Bridge Records)\nhttps://soundcloud.com/slinkyslava\n\nFree before 12, $10 after (+ 1 comp well drink). $5 presale available on RA.\n\nhttps://www.residentadvisor.net/event.aspx?863815\n\nStay dope, Brooklyn.",
    "distance": "203",
    "startTime": "2016-08-20T22:00:00-0400",
    "timeFromNow": 481946,
    "stats": {
        "attending": 44,
        "declined": 3,
        "maybe": 88,
        "noreply": 1250
    },
    "venue": {
        "id": "585713341444399",
        "name": "TBA Brooklyn",
        "coverPicture": "https://scontent.xx.fbcdn.net/v/t1.0-9/s720x720/13932666_1397749103574148_4391608711361541993_n.png?oh=2d82be3a458d1ce9ac8fab47cdbc6e26&oe=585E6545",
        "profilePicture": "https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/12049351_1300865083262551_8221231831784471629_n.jpg?oh=a30798841ad60dfe5cfabaa4e803c3ad&oe=5854DFB9",
        "location": {
            "city": "Brooklyn",
            "country": "United States",
            "latitude": 40.711217064583,
            "longitude": -73.966384349735,
            "state": "NY",
            "street": "395 Wythe Ave",
            "zip": "11249"
        }
    }
},
... 
],
"metadata": {
    "venues": 1,
    "venuesWithEvents": 1,
    "events": 4
}}




 class FacebookEvents
    {
        //[JsonProperty(PropertyName = "id")]
        public string id { get; set; }
        public string name { get; set; }
        public string coverPicture { get; set; }
        public string profilePicture { get; set; }
        public string description { get; set; }
        public string distance { get; set; }
        public string startTime { get; set; }
        public string timeFromNow { get; set; }
        public Stats stats { get; set; }

    }

    class Stats {
        public string attending { get; set; }
        public string declined { get; set; }
        public string maybe { get; set; }
        public string noreply { get; set; }

    }
    class Venue
    {
        public string id { get; set; }
        public string name { get; set; }
        public string coverPicture { get; set; }
        public string profilePicture { get; set; }
        public Location location { get; set; }

    }
    class Location
    {
        public string city { get; set; }
        public string country { get; set; }
        public string latitude { get; set; }
        public string longitude { get; set; }
        public string state { get; set; }
        public string street { get; set; }
        public string zip { get; set; }

    }
2
  • "List my_obj = JsonConvert.DeserializeObject <FacebookEvents> (jsonString); this dont work." - that won't even compile. Commented Dec 6, 2016 at 14:37
  • you root object needs to have an events property of type FacebookEvents[] Commented Dec 6, 2016 at 14:37

2 Answers 2

2

You are missing to define your RootObject which Contains List<Event> and Metadata. Full Example

public class RootObject
{
    public List<Event> events { get; set; }
    public Metadata metadata { get; set; }
}

public class Stats
{
    public int attending { get; set; }
    public int declined { get; set; }
    public int maybe { get; set; }
    public int noreply { get; set; }
}

public class Location
{
    public string city { get; set; }
    public string country { get; set; }
    public double latitude { get; set; }
    public double longitude { get; set; }
    public string state { get; set; }
    public string street { get; set; }
    public string zip { get; set; }
}

public class Venue
{
    public string id { get; set; }
    public string name { get; set; }
    public string coverPicture { get; set; }
    public string profilePicture { get; set; }
    public Location location { get; set; }
}

public class Event
{
    public string id { get; set; }
    public string name { get; set; }
    public string coverPicture { get; set; }
    public string profilePicture { get; set; }
    public string description { get; set; }
    public string distance { get; set; }
    public string startTime { get; set; }
    public int timeFromNow { get; set; }
    public Stats stats { get; set; }
    public Venue venue { get; set; }
}

public class Metadata
{
    public int venues { get; set; }
    public int venuesWithEvents { get; set; }
    public int events { get; set; }
}

This will work:

var result = JsonConvert.DeserializeObject<RootObject>(jsonString); 

EDIT:

First this is JSON, here how you can take Venue information.

foreach(var item in result.events)
{
    Console.WriteLine(item.venue.name);
}
Sign up to request clarification or add additional context in comments.

3 Comments

Tnx for the quick response it worked. What I need todo to get only the venue part of the xml to result?
yes this is logical but I want to see some example with jpath maybe. JObject my_obj2 = JsonConvert.DeserializeObject<JObject>(jsonString); IEnumerable<JToken> venue = my_obj2.SelectTokens("events.venue"); I want to get ONLY the venue nodes in all events. I'm complicating a little bit because I want to understant how this works :)
@LoZo the policy of SO is one question per post, so ask another one and someone will answer you.
1

you need a root object that has an events property to store the collection

public class RootObject {

    public IList<FacebookEvents> events {get;set;}

}

and then you will be able to access events

var root = JsonConvert.DeserializeObject<RootObject>(jsonString); 
var events = root.events;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.