1

当使用 Facebook API 并获取带有标签的故事或帖子时,message_tags属性 (或story_tags) 是按偏移量索引的标签对象。这是一个例子:

{
 . . .
      "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 的格式在这方面是合理的?

4

2 回答 2

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;
   // ....
}
于 2013-08-06T03:20:09.583 回答
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
}
于 2013-06-14T08:50:27.710 回答