用C#反序列化JSON
我试图反序列化一个Facebook朋友图API调用到对象列表。 JSON对象如下所示:
{"data":[{"id":"518523721","name":"ftyft"}, {"id":"527032438","name":"ftyftyf"}, {"id":"527572047","name":"ftgft"}, {"id":"531141884","name":"ftftft"}, {"id":"532652067","name"... List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);
它不工作,因为原始对象是无效的。
我怎样才能反序列化呢?
你需要创build一个这样的结构:
public class Friends { public List<FacebookFriend> data {get;set;} } public class FacebookFriend { public string id {get;set;} public string name {get;set;} }
那么你应该可以做到:
Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);
我的课的名字只是一个例子。 你应该使用正确的名字。
添加样本testing:
string json= @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}"; Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json); foreach(var item in facebookFriends.data) { Console.WriteLine("id: {0}, name: {1}",item.id,item.name); }
生产:
id: 518523721, name: ftyft id: 527032438, name: ftyftyf id: 527572047, name: ftgft id: 531141884, name: ftftft
有时我喜欢dynamic对象
public JsonResult GetJson() { string res; WebClient client = new WebClient(); // Download string. string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId"); // Write values. res = value; dynamic dyn = JsonConvert.DeserializeObject(res); var lstInstagramObjects = new List<InstagramModel>(); foreach(var obj in dyn.data) { lstInstagramObjects.Add(new InstagramModel() { Link = (obj.link != null) ? obj.link.ToString() : "", VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "", CommentsCount = int.Parse(obj.comments.count.ToString()), LikesCount = int.Parse(obj.likes.count.ToString()), CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))), ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "", User = new InstagramModel.UserAccount() { username = obj.user.username, website = obj.user.website, profile_picture = obj.user.profile_picture, full_name = obj.user.full_name, bio = obj.user.bio, id = obj.user.id, } }); } return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet); }
很容易,我们可以借助字典和JavaScriptSerializer来parsingjson。 这里是我从ashx文件parsingjson的示例代码。
var jss = new JavaScriptSerializer(); string json = new StreamReader(context.Request.InputStream).ReadToEnd(); Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json); string _Name = sData["Name"].ToString(); string _Subject = sData["Subject"].ToString(); string _Email = sData["Email"].ToString(); string _Details = sData["Details"].ToString();
我同意伊卡洛斯(会有评论,如果我可以),而不是使用一个CustomObject类,我会使用一个字典 (在情况下Facebook添加的东西)。
private class MyFacebookClass { public IList<IDictionary<string, string>> data { get; set; } }
要么
private class MyFacebookClass { public IList<IDictionary<string, object>> data { get; set; } }
Newtonsoft.JSON
是这种情况的一个很好的解决scheme。 另外Newtonsof.JSON
比其他的如JavaScriptSerializer
, DataContractJsonSerializer
更快。
在这个示例中,您可以执行以下操作:
var jsonData = JObject.Parse("your json data here");
然后,您可以将jsonData投射到JArray
并且您可以使用for循环在每次迭代中获取数据。 另外,我想添加一些东西。
for (int i = 0; (JArray)jsonData["data"].Count; i++) { var data = jsonData[i - 1]; }
使用dynamic对象和使用Newtonsoft序列化是一个不错的select。