如何从嵌套结构中检索值
本文关键字:检索 结构 嵌套 | 更新日期: 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的任何原因