使用Facebook API并获取带有标签的故事或帖子时,message_tags
属性(或story_tags
)是由offset索引的标签对象。这是一个例子:
{
. . .
"message": "Dhiren Patel likes Marmot.",
"message_tags": {
"19": [
{
"id": 101961456410,
"name": "Marmot",
"offset": 19,
"length": 6
}
],
"0": [
{
"id": 1207059,
"name": "Dhiren Patel",
"offset": 0,
"length": 12
}
]
},
. . .
}
这显然有效,但由于每个标签已经在属性中包含其偏移量,因此不必要地详细说明。为什么每个标签都必须按其偏移量编入索引?同样有效的格式不是简单地制作message_tags
和标签数组而不是像这样的对象吗?
{
. . .
"message": "Dhiren Patel likes Marmot.",
"message_tags": [
{
"id": 101961456410,
"name": "Marmot",
"offset": 19,
"length": 6
},
{
"id": 1207059,
"name": "Dhiren Patel",
"offset": 0,
"length": 12
}
],
. . .
}
如果有一些效率提升可以证明Facebook的格式是合理的吗?
答案 0 :(得分:2)
为方便起见,我假设。下面的代码是用Javascript编写的,但对于Python和其他语言来说也很容易。
首先,message_tags
作为有序数组并不是非常有用,因为无论如何都可能必须验证顺序,因此任何代码都可能必须将其视为无序数组。
对象是无序数组的良好替代品,因为每个对象键可以是每个条目的唯一标识符。在这种情况下,当您已经知道偏移时,它可以很容易地获取标签数据。
// Validate message_tags order, and create an ordered list of each offset.
var offsets = [];
for each (var tag in message_tags) {
offsets.push(tag.offset);
}
offsets.sort();
// Process each tag.
for (var i = 0; i < offsets.length; i++) {
var offset = offsets[i];
var tag = message_tags[offset]; // Convenient!
var length = tag.length;
// ....
}
答案 1 :(得分:0)
我做了一些测试,找不到你发现的前缀message_tags。请确认。如果是这样,您的初始问题现在无效。如果您有另一个触发观察的场景,请分享以便我可以检查您的场景。
{
"id": "5940395639***",
"from": {
"name": "Ricky",
"id": "70585***"
},
"message": "Ricky and Jack test",
"message_tags": [
{
"id": "70585***",
"name": "Ricky",
"type": "user",
"offset": 0,
"length": 5
},
{
"id": "100005***",
"name": "Jack",
"type": "user",
"offset": 10,
"length": 4
}
],
"can_remove": true,
"created_time": "2013-06-14T08:41:24+0000",
"like_count": 0,
"user_likes": false
}