4

このようにAppleからJSONを取得しました

{
    "original-purchase-date-pst" = "2012-06-28 02:46:02 America/Los_Angeles";
    "original-transaction-id" = "1000000051960431";
    "bvrs" = "1.0";
    "transaction-id" = "1000000051960431";
    "quantity" = "1";
    "original-purchase-date-ms" = "1340876762450";
    "product-id" = "com.x";
    "item-id" = "523404215";
    "bid" = "com.x";
    "purchase-date-ms" = "1340876762450";
    "purchase-date" = "2012-06-28 09:46:02 Etc/GMT";
    "purchase-date-pst" = "2012-06-28 02:46:02 America/Los_Angeles";
    "original-purchase-date" = "2012-06-28 09:46:02 Etc/GMT";
}

これは私たちが知っているJSONではありません。JSONでは、明確に定義されています

各名前の後には : (コロン) が続き、名前と値のペアは , (コンマ) で区切られます。

Pythonのjson(またはsimplejson)モジュールでそれを解析するにはどうすればよいですか?

jsoninのみをサポートseparatorsし、 inおよび inはサポートしjson.dumps()ません。 には、 およびのハードコーディングされた区切り文字があります。json.loads()simplejson/decoder.pydef JSONObject():,

私に何ができる?独自のパーサーを作成しますか?

4

3 に答える 3

5

それは確かにかなりめちゃくちゃです。簡単な修正は、問題のあるセパレーターを正規表現に置き換えることです。

line = re.compile(r'("[^"]*")\s*=\s*("[^"]*");')
result = line.sub(r'\1: \2,', result)

最後のコンマも削除する必要があります。

trailingcomma = re.compile(r',(\s*})')
result = trailingcomma.sub(r'\1', result)

これらの操作により、例は json として読み込まれます。

>>> import json, re
>>> line = re.compile('("[^"]*")\s*=\s*("[^"]*");')
>>> result = '''\
... {
...     "original-purchase-date-pst" = "2012-06-28 02:46:02 America/Los_Angeles";
...     "original-transaction-id" = "1000000051960431";
...     "bvrs" = "1.0";
...     "transaction-id" = "1000000051960431";
...     "quantity" = "1";
...     "original-purchase-date-ms" = "1340876762450";
...     "product-id" = "com.x";
...     "item-id" = "523404215";
...     "bid" = "com.x";
...     "purchase-date-ms" = "1340876762450";
...     "purchase-date" = "2012-06-28 09:46:02 Etc/GMT";
...     "purchase-date-pst" = "2012-06-28 02:46:02 America/Los_Angeles";
...     "original-purchase-date" = "2012-06-28 09:46:02 Etc/GMT";
... }
... '''
>>> line = re.compile(r'("[^"]*")\s*=\s*("[^"]*");')
>>> trailingcomma = re.compile(r',(\s*})')
>>> corrected = trailingcomma.sub(r'\1', line.sub(r'\1: \2,', result))
>>> json.loads(corrected)
{u'product-id': u'com.x', u'purchase-date-pst': u'2012-06-28 02:46:02 America/Los_Angeles', u'transaction-id': u'1000000051960431', u'original-purchase-date-pst': u'2012-06-28 02:46:02 America/Los_Angeles', u'bid': u'com.x', u'purchase-date-ms': u'1340876762450', u'original-transaction-id': u'1000000051960431', u'bvrs': u'1.0', u'original-purchase-date-ms': u'1340876762450', u'purchase-date': u'2012-06-28 09:46:02 Etc/GMT', u'original-purchase-date': u'2012-06-28 09:46:02 Etc/GMT', u'item-id': u'523404215', u'quantity': u'1'}

ネストされたマッピングも処理する必要があります。"ただし、これは、値自体にエスケープされた引用符がないことを前提としています。とにかくパーサーが必要です。

于 2012-06-28T10:38:38.400 に答える
3

iTunes への HTTP リクエスト ヘッダーに次を追加すると、

{'Content-Type' : 'application/json'}

json.loads で動作する実際の JSON 形式の応答を返します。

于 2013-08-12T21:36:50.827 に答える
1

私はこのヘルパー関数を機能させましたが、今のところ十分に機能しているようです。これを使用して、着信 (未検証) のレシートを JSON に変換し、トランザクション ID を抽出しています。検証後、2 つのトランザクション ID を比較して一致することを確認します。

    function PropertyArrayStringToArray($data)
    {
        $data = str_replace(PHP_EOL, '', $data); 
        $data = preg_replace('/\t/', '', $data);  
        $data = str_replace('" = "'  ,'":"',$data);
        $data = str_replace('"="'    ,'":"',$data);
        $data = str_replace('";'     ,'",',$data);
        $data = str_replace(',}'     ,'}',$data);
        return json_decode($data,true);
    }

自由に使用して(自己責任で)、改善してください。

于 2015-04-09T12:56:42.507 に答える