5
{
  name: 'com.riotgames.platform.summoner.PublicSummoner',
  keys: [ 'internalName', 'dataVersion', 'acctId', 'name', 'profileIconId', 'revisionDate', 'revisionId', 'summonerLevel', 'summonerId', 'futureData' ],
  object: {
    internalName: 'mrquackers',
    dataVersion: 0,
    acctId: { value: 34117327 },
    name: 'MrQuackers',
    profileIconId: 502,
    revisionDate: Tue, 30 Oct 2012 19:38:32 GMT,
    revisionId: { value: 0 },
    summonerLevel: { value: 30 },
    summonerId: { value: 20933307 },
    futureData: null
  },
  encoding: 0
}

(编辑添加的换行符和缩进;不是响应的一部分)

这是来自 RTMP 数据包的响应,我不确定如何解析它。php中是否有一个库或者我可以将它转换为像json这样易于解析的东西?

4

3 回答 3

1

不可以。如果您不知道响应使用的语言,则无法自动解析它。

虽然响应看起来像 JSON,但它不是。它甚至不接近JSON。您不能只引用键以使其成为有效的 JSON。

除了revisionDate,它似乎是有效的 Javascript,但谁知道呢?

解析器需要知道它可能遇到的每种数据类型。不知道响应中会出现什么。除非您找到这种格式的文档,否则您永远不知道您会遇到什么。

理论上,您可以解析您认为此响应的语言。但

  1. 您需要实现自己的解析器。这并不容易。完全没有。
  2. 你不能假设你知道响应者的语言。此响应是有效 javascript 的一个值
  3. 一个实现不佳的解析器甚至不会知道它遇到了它不理解的东西。非但不放弃,反而会产生意想不到的结果
  4. 如果您修改语言模型,如果您的解析器不是成熟的解析器,那么将更改合并到解析器中很容易导致解析器的完全重写。

结论:

您不知道响应者所说的语言。这意味着您无法解析它。先找文档,再讲解析。

于 2012-10-30T21:13:27.073 回答
0

如果您使用 Flash/AS3 接收此数据包,则可以使用as3corelib JSONDecoder类。

以下是使用您提供的 JSON 示例的示例:

import com.adobe.serialization.json.JSON;

var raw:String = "{ name: 'com.riotgames.platform.summoner.PublicSummoner', keys: [ 'internalName', 'dataVersion', 'acctId', 'name', 'profileIconId', 'revisionDate', 'revisionId', 'summonerLevel', 'summonerId', 'futureData' ], object: { internalName: 'mrquackers', dataVersion: 0, acctId: { value: 34117327 }, name: 'MrQuackers', profileIconId: 502, revisionDate: Tue, 30 Oct 2012 19:38:32 GMT, revisionId: { value: 0 }, summonerLevel: { value: 30 }, summonerId: { value: 20933307 }, futureData: null }, encoding: 0 }";
// 1. Add quotes to all keys. 2. Wrap string around date object. 3. Replace single quotes with double quotes.
raw = raw.replace(/([\w]+): /g, "'$1': ").replace(/\w+, \d* \w+ \d* \d*:\d*:\d* \w+/g, "'$&'").replace(/'/g, "\"");

var json:Object = JSON.decode(raw, false);
var date:Date = new Date(json.object.revisionDate);

trace(json.name); // "com.riotgames.platform.summoner.PublicSummoner"
trace(date.month); // 9
于 2012-10-30T20:16:27.910 回答
0

这就是我要做的。这里唯一的问题是修订日期,最好将其转换为要由 ActionScript 处理的时间戳(或转换为字符串,如果您愿意),因此我将使用该preg_replace_callback()函数将其更改为前一个条件或preg_replace()函数后一种情况:

// this is for numeric timestamp: 1351625912
$str = preg_replace_callback('~(?<=\srevisionDate:\s).+?(?=,\n|,\r|,\r\n)~',
create_function('$m','return strtotime($m[0]);'),$str);

// alternatively, you can wrap it with single quotes: 'Tue, 30 Oct 2012 19:38:32 GMT'
//$str = preg_replace('~(?<=\srevisionDate:\s).+?(?=,\n|,\r|,\r\n)~',"'$0'",$str);

echo $str;
于 2012-10-31T00:29:59.427 回答