为什么Facebook会将offset_tags索引为offset?

时间:2012-12-11 20:23:18

标签: facebook facebook-graph-api tags

使用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的格式是合理的吗?

2 个答案:

答案 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
}