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 であることによる1 つの値です。
  3. 不完全に実装されたパーサーは、理解できない何かに遭遇したことさえ知りません。諦めるどころか思わぬ結果を生む
  4. 言語のモデルを変更した場合、パーサーが本格的なパーサーでない場合、変更をパーサーに組み込むと、パーサーが完全に書き直される可能性があります。

結論:

応答者が話している言語がわからない。これは、解析できないことを意味します。最初にドキュメントを見つけてから、解析について話してください。

于 2012-10-30T21:13:27.073 に答える
0

Flash / AS3を使用してこのパケットを受信して​​いる場合は、 as3corelibJSONDecoderクラスを使用できます。

提供した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

これが私がすることです。ここでの唯一の問題は、revisionDate に関するものです。これは、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 に答える