首页 文章

使用C#反序列化JSON

提问于
浏览
187

我正在尝试将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);

它不起作用,因为原始对象无效 .
我怎样才能反序化呢?

6 回答

  • 14

    你需要创建一个这样的结构:

    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);
    

    我的 class 名称只是一个例子 . 你应该使用专有名称 .

    添加样品测试:

    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
    
  • 47

    有时我更喜欢动态对象:

    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);
    }
    
  • 25

    我们可以很容易地在字典和JavaScriptSerializer的帮助下解析json . 这是我从ashx文件解析json的示例代码 .

    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();
    
  • 15

    为您自动生成这些类的一个好方法是复制JSON输出并将其放在此处:

    http://json2csharp.com/

    它将为您提供一个起点来修改您的类以进行反序列化 .

  • 233

    Newtonsoft.JSON 对于这种情况是一个很好的解决方案 . 此外 Newtonsof.JSON 比其他如 JavaScriptSerializerDataContractJsonSerializer 更快 .

    在此示例中,您可以执行以下操作:

    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];
    }
    

    使用动态对象并使用Newtonsoft序列化是一个不错的选择 .

  • 25

    我同意Icarus(如果可以,我会评论),但不使用 CustomObject 类,我会使用 Dictionary (如果facebook添加了一些内容) .

    private class MyFacebookClass
    {
       public IList<IDictionary<string, string>> data { get; set; }
    }
    

    要么

    private class MyFacebookClass
    {
       public IList<IDictionary<string, object>> data { get; set; }
    }
    

相关问题