【问题标题】:Deserialize Json to Class that implements Ienumerable in Asp.net将 Json 反序列化为在 Asp.net 中实现 Ienumerable 的类
【发布时间】:2012-02-09 12:39:13
【问题描述】:

我有下面的函数,它获取 facebook 数据并将其作为字符串返回。

public static string GetUserNewsFeed(string strAccessToken)
{
    Dictionary<string, object> PostDetail = new Dictionary<string, object>();
    DateTime CreatedDateTime = DateTime.Today.AddDays(-90);
    var epoch = (CreatedDateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    PostDetail.Add("Posts", "SELECT post_id,source_id FROM stream WHERE filter_key in (SELECT filter_key FROM stream_filter WHERE uid=me() AND type='newsfeed') and (likes.count > 0 or comments.count > 0) and created_time > " + epoch);
    PostDetail.Add("PostComments", "select post_id,fromid from comment where post_id in (select post_id from #Posts)");
    PostDetail.Add("PostLikes", "SELECT object_id,post_id,user_id FROM like WHERE post_id in (select post_id from #Posts)");
    string Json = HttpUtility.UrlEncode(Newtonsoft.Json.JsonConvert.SerializeObject(PostDetail));       
    return RunFQLQuery(Json, strAccessToken);
}

这是调用此函数并使用 Json.NET 将其转换为 Jobject 的代码:

strFeed = FacebookAPI.GetUserNewsFeed(Convert.ToString(Session["access_token"]));
JObject objStreamData = JObject.Parse(strFeed);
var PostResponse = objStreamData.SelectToken("data[0]");

下面一行将其反序列化为 NewsFeedPost 类:

var Posts = JsonConvert.DeserializeObject<NewsFeedPost>(PostResponse.ToString());

下面是类:

public class NewsFeedPost 
{      
    public string name { get; set; }
    public List<Post> fql_result_set { get; set; }
}
public class Post
{
    public string post_id { get; set; }
    public string source_id { get; set; }
}

现在的问题是,当我将 NewsFeedPost 类更改为以下时,它会抛出错误“无法将 JSON 对象反序列化为类型 'BAL.NewsFeedPost'”:

public class NewsFeedPost : IEnumerable<Post>
{      
    public string name { get; set; }
    public List<Post> fql_result_set { get; set; }
    public IEnumerator<Post> GetEnumerator()
    {
        foreach (Post item in fql_result_set)
        {
            yield return item;
        }
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

}

以下是 Json Response 的示例:

{
  "data": [
{
  "name": "Posts",
  "fql_result_set": [
    {
      "post_id": "1"
    },
    {
      "post_id": "2"
    }
  ]
},
{
  "name": "PostComments",
  "fql_result_set": [
    {
      "post_id": "3",
      "fromid": 4
    },
    {
      "post_id": "5",
      "fromid": 6
    }
  ]
},
{
  "name": "PostLikes",
  "fql_result_set": [
    {
      "object_id": 7,
      "post_id": "8",
      "user_id": 9
    },
    {
      "object_id": 10,
      "post_id": "11",
      "user_id": 12
    }
  ]
}
]
}

我只想枚举列表并创建逗号分隔列表并将其保存到数据库。任何人都可以阐明需要做什么吗?如何获取列表的计数和长度属性?

【问题讨论】:

  • 您能否发布一个您尝试反序列化的 JSON 示例?

标签: c# asp.net facebook json.net


【解决方案1】:

两件事:

1) 将JsonObjectAttribute 添加到NewsFeedPost

[JsonObject]
public class NewsFeedPost : IEnumerable<Post>

2) 要反序列化您显示的 JSON,您需要另一个类:

public class NewsFeedPosts
{
    public List<NewsFeedPost> Data { get; set; }
}

然后您将使用该类调用您的反序列化作为您想要反序列化的内容:

var Posts = JsonConvert.DeserializeObject<NewsFeedPosts>(PostResponse.ToString());

【讨论】:

  • 只需用 JsonObject 属性装饰我的类就可以了,并且不必再声明一个类。非常感谢。我真的很感激。
【解决方案2】:

您可能想尝试对 DeserializeObject 进行强制转换

var Posts = JsonConvert.DeserializeObject<NewsFeedPost>((NewsFeedPost)PostResponse.ToString());

【讨论】:

  • 您是否将字符串投射到 NewsFeedPost?这是错误的代码。
猜你喜欢
  • 2020-01-17
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2015-03-17
  • 2012-09-20
相关资源
最近更新 更多