问题
I am not able to get my head around extracting the work_history, affiliations and current_loc of the facebook user from the JSON string that is generated after i run my fql query
I have made this class :
public class Data
{
public CurrentLocation current_location { get; set; }
public WorkHistory[] work_history { get; set; }
public EducationHistory[] education_history { get; set; }
}
public class EducationHistory
{
public string name { get; set; }
public int? year { get; set; }
public string school_type { get; set; }
}
public class WorkHistory
{
public string company_name { get; set; }
public Location location { get; set; }
}
public class CurrentLocation
{
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
}
public class Location
{
public string city { get; set; }
public string state { get; set; }
}
The format of my JSON string is :
{"current_location":{"city":"Delhi","state":"Delhi","country":"India","zip":"","id":102161913158207,"name":"Delhi, India"}
,"education_history":[{"name":"I E T , Alwar (Raj.)","year":2007,"concentrations":[],"school_type":"College"},{"name":"Institute of Engineering and Technology, Alwar","concentrations":[],"school_type":"College"}],
"work_history": [{"location":{"city":"","state":""},"company_name":"Defence Research & Development Organisation (DRDO)","description":"","start_date":"0000-00","end_date":"0000-00"}]}
How do i extract this Data i get a null when i use this code :
Data soap = JsonConvert.DeserializeObject<Data>(ser);
Edit : I did change the code according to what an answer suggested i still get no values

Edit 2: the solution that is provided would have worked if i had only one user however i have several users having these details how do i get this data? There are several like these values given below for different users
{
"data": [
{
"uid": 54456565,
"name": "dgfg Barma",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/275277_513046358_147089990_q.jpg",
"affiliations": [
{
"nid": 33605704,
"name": "Our Lady Queen of the Missions School",
"type": "high school"
}
],
"birthday_date": null,
"sex": "female",
"relationship_status": null,
"current_location": {
"city": "Delhi",
"state": "Delhi",
"country": "India",
"zip": "",
"id": 102161913158207,
"name": "Delhi, India"
},
"education_history": [
{
"name": "Amity University",
"concentrations": [],
"school_type": "College"
},
{
"name": "Amity School of Engineering & Technology",
"concentrations": [],
"school_type": "College"
}
],
"work_history": []
},
{
"uid": 520310824,
"name": "Mamta Meena",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/370835_520310824_553662476_q.jpg",
"affiliations": [],
"birthday_date": "12/03/1986",
"sex": "female",
"relationship_status": "Married",
"current_location": {
"city": "Delhi",
"state": "Delhi",
"country": "India",
"zip": "",
"id": 102161913158207,
"name": "Delhi, India"
},
"education_history": [
{
"name": "I E T , Alwar (Raj.)",
"year": 2007,
"concentrations": [],
"school_type": "College"
},
{
"name": "Institute of Engineering and Technology, Alwar",
"concentrations": [],
"school_type": "College"
}
],
"work_history": [
{
"location": {
"city": "",
"state": ""
},
"company_name": "Defence Research & Development Organisation (DRDO)",
"description": "",
"start_date": "0000-00",
"end_date": "0000-00"
}
]
},
{
"uid": 6565767,
"name": "gfgfg Agarwal",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/372433_529863326_1656605196_q.jpg",
"affiliations": [
{
"nid": 16827518,
"name": "Amity University",
"type": "college"
}
],
"birthday_date": "07/18",
"sex": "female",
"relationship_status": null,
"current_location": {
"city": "Delhi",
"state": "Delhi",
"country": "India",
"zip": "",
"id": 102161913158207,
"name": "Delhi, India"
},
"education_history": [
{
"name": "Amity University, Noida",
"year": 2012,
"concentrations": [],
"school_type": "College"
},
{
"name": "Amity University",
"concentrations": [],
"school_type": "Grad School"
}
],
"work_history": []
},
{
"uid": 542580357,
"name": "bnnm Gupta",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/372576_542580357_1330958366_q.jpg",
"affiliations": [],
"birthday_date": "04/30",
"sex": "female",
"relationship_status": "Single",
"current_location": {
"city": "New Delhi",
"state": "Delhi",
"country": "India",
"zip": "",
"id": 106517799384578,
"name": "New Delhi, India"
},
"education_history": [
{
"name": "Amity University",
"concentrations": [],
"school_type": "College"
},
{
"name": "Amity University, Noida",
"concentrations": [],
"school_type": "College"
}
],
"work_history": [
{
"location": {
"city": "",
"state": ""
},
"company_name": "Oracle India Pvt Ltd",
"position": "Intern",
"description": "",
"start_date": "2011-05"
}
]
},
{
"uid": 544204117,
"name": "pos Gupta",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/275346_544204117_594313449_q.jpg",
"affiliations": [
{
"nid": 16827518,
"name": "Amity University",
"type": "college"
}
],
"birthday_date": "05/17/1990",
"sex": "female",
"relationship_status": "Single",
"current_location": {
"city": "Noida",
"state": "Uttar Pradesh",
"country": "India",
"zip": "",
"id": 130646063637019,
"name": "Noida, India"
},
"education_history": [
{
"name": "Amity University, Noida",
"year": 2012,
"concentrations": [],
"school_type": "College"
},
{
"name": "Amity University",
"concentrations": [],
"school_type": "Grad School"
}
],
"work_history": []
},
{
"uid": 4567786,
"name": "orr Makhijani",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-snc4/372443_555253796_244086438_q.jpg",
"affiliations": [
{
"nid": 16827518,
"name": "Amity University",
"type": "college"
}
],
"birthday_date": null,
"sex": "female",
"relationship_status": null,
"current_location": null,
"education_history": [
{
"name": "Amity University",
"concentrations": [],
"school_type": "College"
}
],
"work_history": []
},
{
"uid": 556773604,
"name": "Nazima Khalid",
"pic_square": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash2/372542_556773604_1472126324_q.jpg",
"affiliations": [],
"birthday_date": "03/22",
"sex": "female",
"relationship_status": "Married",
"current_location": {
"city": "Toronto",
"state": "Ontario",
"country": "Canada",
"zip": "",
"id": 110941395597405,
"name": "Toronto, Ontario"
},
"education_history": [
{
"name": "AMU",
"concentrations": [],
"school_type": "College"
}
],
"work_history": [
{
"location": {
"city": "Oakville",
"state": "Ontario"
},
"company_name": "SNC-Lavalin Inc.",
"position": "Contracts",
"description": "",
"start_date": "0000-00"
}
]
}
]
}
Please help
回答1:
You need to use correct property names that match your JSON structure:
using System;
using Newtonsoft.Json;
public class Data
{
public CurrentLocation current_location { get; set; }
public WorkHistory[] work_history { get; set; }
public EducationHistory[] education_history { get; set; }
}
public class EducationHistory
{
public string name { get; set; }
public int? year { get; set; }
public string school_type { get; set; }
}
public class WorkHistory
{
public string company_name { get; set; }
public Location location { get; set; }
}
public class CurrentLocation
{
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
}
public class Location
{
public string city { get; set; }
public string state { get; set; }
}
class Program
{
static void Main()
{
var json =
@"
{
""current_location"": {
""city"": ""Delhi"",
""state"": ""Delhi"",
""country"": ""India"",
""zip"": """",
""id"": 102161913158207,
""name"": ""Delhi, India""
},
""education_history"": [
{
""name"": ""I E T , Alwar (Raj.)"",
""year"": 2007,
""concentrations"": [],
""school_type"": ""College""
},
{
""name"": ""Institute of Engineering and Technology, Alwar"",
""concentrations"": [],
""school_type"": ""College""
}
],
""work_history"": [
{
""location"": {
""city"": """",
""state"": """"
},
""company_name"": ""Defence Research & Development Organisation (DRDO)"",
""description"": """",
""start_date"": ""0000-00"",
""end_date"": ""0000-00""
}
]
}";
Data soap = JsonConvert.DeserializeObject<Data>(json);
Console.WriteLine(soap.current_location.city);
}
}
As far as the affiliations
property is concerned, I don't see any relation to it with your JSON, so I simply removed it from the Data object and replaced it with the EducationHistory
type.
UPDATE:
And to handle multiple nodes you could adapt your models:
public class Result
{
public Data[] data { get; set; }
}
public class Data
{
public CurrentLocation current_location { get; set; }
public WorkHistory[] work_history { get; set; }
public EducationHistory[] education_history { get; set; }
}
public class EducationHistory
{
public string name { get; set; }
public int? year { get; set; }
public string school_type { get; set; }
}
public class WorkHistory
{
public string company_name { get; set; }
public Location location { get; set; }
}
public class CurrentLocation
{
public string city { get; set; }
public string state { get; set; }
public string country { get; set; }
}
public class Location
{
public string city { get; set; }
public string state { get; set; }
}
and then:
Result soap = JsonConvert.DeserializeObject<Result>(json);
Console.WriteLine(soap.data[0].current_location.city);
回答2:
Instead of declaring a lot of tiny classes I would go dynamic
way. Here is the code for dynamic json object. And the usage would be something like this:
dynamic obj = JsonUtils.JsonObject.GetDynamicJsonObject(jsonString);
Console.WriteLine("{0} , {1}", obj.current_location.city, obj.current_location.state);
Console.WriteLine("EDUCATION");
foreach (var eduHist in obj.education_history)
{
Console.WriteLine("{0} , {1}", eduHist.name, eduHist.year);
}
Console.WriteLine("WORK");
foreach (var workHist in obj.work_history)
{
Console.WriteLine("{0} {1}-{2}", workHist.company_name, workHist.start_date, workHist.end_date);
}
回答3:
Here's another example that's working for retrieving id, name, picture and friends. You must include reference to newtonsoft.json package.
[TestClass]
public class FbRequestParserTests
{
[TestMethod]
public void ParseFacebookResponse()
{
var response =
@"{
""id"": ""123123"",
""name"": ""My name"",
""picture"": {
""data"": {
""is_silhouette"": false,
""url"": ""https://scontent.xx.fbcdn.net/v/t1.0-1/p50x50/14572785_123""
}
},
""friends"": {
""data"": [
{
""name"": ""Friend 1"",
""id"": ""123""
},
{
""name"": ""Friend 2"",
""id"": ""234""
}
],
""paging"": {
""cursors"": {
""before"": ""QVFIUk1yRE9zTkhFdkc1TFV2SHVpaE1IYUJ4V2ljbUJSbjYxaGhnX05IcTNYWHp0ekNHZAnh6LThs"",
""after"": ""QVFIUjFFQW5kVmJiTmMxZAHN6cWNDdUl5VnVJVl91UG0yV2hMOVl5N21GTDVxQ2JVQ2hjQVlRYXBxNDNkWWI3YjZAkZAFBV""
}
},
""summary"": {
""total_count"": 456
}
}
}";
var result = JsonConvert.DeserializeObject<FbResponse>(response);
Assert.AreEqual(result.Id, 123123);
Assert.AreEqual(result.Name, "My Name");
}
}
public class FbResponse
{
public long Id { get; set; }
public string Name { get; set; }
public Picture Picture { get; set; }
public Friends Friends { get; set; }
}
public class Friends
{
public List<FriendsData> Data { get; set; }
public Paging Paging { get; set; }
public Summary Summary { get; set; }
}
public class Summary
{
public int Total_Count { get; set; }
}
public class Paging
{
public Cursors Cursors { get; set; }
}
public class Cursors
{
public string Before { get; set; }
public string After { get; set; }
}
public class FriendsData
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Picture
{
public PictureData Data { get; set; }
}
public class PictureData
{
public bool Is_Silhouette { get; set; }
public string Url { get; set; }
}
来源:https://stackoverflow.com/questions/9341948/deserialization-of-a-facebook-json-string