如何从嵌套结构中检索值

本文关键字:检索 结构 嵌套 | 更新日期: 2023-09-27 18:06:06

我正在创建应用程序,使用FQL从我的Facebook页面检索数据。fql查询是:

select id, text, attachment.media.image.src FROM comment 
where post_id IN (SELECT post_id from stream where 
                  source_id = "mypageid" AND  actor_id = "mypageid" LIMIT 100)

我用这种方式得到了ID和TEXT的值:

public class MyComments
{
    public string id { get; set; } // this is comment id
    public string text { get; set; } // this is the comment
}
List<MyComments> q = JsonConvert.DeserializeObject<List<MyComments>>
                                                     (results.data.ToString());
if (q.Count != 0)
{
    post_id = q[0].id.ToString();
    post_text = q[0].text.ToString();
}

但是如何获得SRC的值,因为它是struct中的struct attachment> in struct media> in struct image> string SRC .

是否有可能获得字符串SRC的值?用c#代码?

请各位提前感谢

如何从嵌套结构中检索值

我没有使用过FQL,但是JSON很容易处理。

要做的第一件事是检查FQL返回的JSON对象,看看它是否有嵌套的结构对象。假设是这样,您需要为每个嵌套对象创建一个类。

让我们假设你有一个类似于这样的JSON结构:

[{
    "id": "<comment id>",
    "text": "<comment text>",
    "attachment": {
        "media": {
            "image": {
                src: "<image source string>"
            }
        }
    }
}, {
    ...
}]

为了将其解压缩到c#类中,您需要为每个级别创建一个类:attachment -> media -> image:

public class MyComments
{
    public string id { get; set; }
    public string text { get; set; }
    public Attachment attachment { get; set; }
    public class Attachment
    {
        public Media media { get; set; }
    }
    public class Media 
    {
        public Image image { get; set; }
    }
    public class Image 
    {
        public string src { get; set; }
    }
}

当然,如果你在单个响应之外使用这些类,你可以取消嵌套它们并添加你可能使用的任何其他字段。我发现使用这种方式更简单,因为所有内容都封装在结果记录类中。

一旦你反序列化了来自FQL的响应,你应该能够使用(在上面的代码中)访问src项:

post_src = q[0].attachment.media.image.src;

只要注意JSON与您为它设置的结构匹配,否则您将得到一些反序列化错误。尤其要注意数组——除非你准备好了,否则它们会把你搞得一团糟。


编辑:[删除了数组部分,因为它不适合你的实际用例]


下面是一组类,它们将反序列化你在PasteBin上发布的JSON:

public class MyComments
{
    public string post_id;
    public string message;
    public Attachment attachment;

    public class Attachment
    {
        public Media[] media;
    }
    public class Media
    {
        public string href;
        public string alt;
        public string type;
        public string src;
        public Photo photo;
    }
    public class Photo
    {
        public string aid;
        public string pid;
        public string fbid;
        public string owner;
        public int index;
        public int width;
        public int height;
        public Image[] images;
    }
    public class Image
    {
        public string src;
        public int width;
        public int height;
    }
}

对发布的JSON进行测试:

MyComments comment = JsonConvert.DeserializeObject<MyComments>(jsrc);
Console.WriteLine("Source: {0}", comment.attachment.media[0].photo.images[0].src);
输出:

Source: https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-xfa1/t1.0-9/s720x720/10288743_852243528123890_8104585654908358176_n.jpg

请注意,数组可以是空的,所以上面的IndexOutOfRangeException可能会失败。在索引数组之前,一定要测试数组的Length

我将在MyComments.Photo类中编写一些代码来查找符合您的标准的图像-例如,最大尺寸。像这样:

public Image LargestImage()
{
    return images.OrderByDescending(i => i.width).ThenByDescending(i => i.height).FirstOrDefault();
}

那么你总是可以得到最大的图像,不管图像以什么顺序提供,或者null,如果图像列表是空的:

var img = comment.attachment.media[0].photo.LargestImage();
if (img != null)
    Console.WriteLine("Source: {0}", img.src);

对于附在评论上的所有媒体的最大图片的来源列表:

var q = 
    (
        from m in comment.attachment.media
        let img = m.photo.LargestImage()
        where img != null
        select img.src
    ).ToList();

或者没有LargestImage方法:

var q = 
    (
        from m in comment.attachment.media
        let img = m.photo.images
            .OrderByDescending(i => i.width)
            .ThenByDescending(i => i.height)
            .FirstOrDefault()
        where img != null
        select img.src
    ).ToList();

工作,即使没有images条目可以解析出JSON的任何原因