PHP FQL tarafından döndürülen büyük bir kullanıcı kimlikleri Taşıma

5 Cevap php

Ben Facebook, kullanıcıların bir listesini almak için FQL kullanıyorum. Tutarlılık için JSON olarak sonuç almak. , Bazı int sığmayacak kadar büyük olduğundan, dönen JSON numaraları, json_decode (as kullanıcı kimlikleri kodlar beri) kayan nokta değerleri için bu numaraları dönüştürür - Bu bir soruna neden olur Tabii, ben dizeleri gibi bu kimlikleri gerekir.

Json_decode () herhangi bir davranış bayrakları kabul etmeden kendi şeyi yapar beri, ben bir kayıp değilim. Bu nasıl çözüleceği konusunda herhangi bir öneriniz?

5 Cevap

Eğer işlev çağrısı bir bayrak belirtirseniz json_decode(), dizelere Büyük tamsayıları dönüştürebilirsiniz:

$array = json_decode($json, true, 512, JSON_BIGINT_AS_STRING)

Benim FQL API çağrısına &format=json-strings ekleyerek, gibi pek tarafından sorunu çözüldü ettik:

$myQuery = "SELECT uid2 FROM friend WHERE uid1=me()";
$facebook->api("/fql?q=" . urlencode($myQuery) . "&format=json-strings")

This tells facebook to wrap all the numbers in quotes, which leads json_decode to use neither int-s not floats.

Çünkü korkmuştum bu sorunu FQL ama ben kadar onun tüm dönmek için Facebook zorlamak için Facebook'un PHP SDK biraz yama gibi gitti ettik BIG-IntS olarak kimlikleri bazı temsil tercih tüm grafik API çağrıları ile sınırlı değildir dizeleri gibi sayılar.

I've added this one line to the _graph function. This would be line 738 in facebook_base.php, version 3.1.1

$params['format'] = 'json-strings';

Tabii düzeltme

I json_decode üstel sayılar içine son twitter / tweet kimlikleri dönüştürme oldu benzer bir sorun vardı.

Björn's answer is great if you want your BIGINT to become a string - and have PHP 5.3+. If neither of those things are true, another option is to up PHP's float precision. This can be done a different few ways...

  • php.ini precision değerini bulmak ve precision = 20 olarak değiştirin
  • PHP uygulaması için ini_set('precision', 20); ekleyin
  • sizin app. htaccess veya sanal konak dosyasına php_value precision 20 ekleyin

Hızlı ve kirli, şimdi iş gibi görünüyor:

$sJSON = preg_replace('/:(\d+)/', ':"${1}"', $sJSON);

Bunu kullanmak ve neredeyse harika çalışıyor.

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true)

Coğrafi veri yoktur dahil json sonları, örn. "lat":"54".2341 in {"lat":54.2341} sonuç

Çözüm:

$json = preg_replace('/("\w+"):(\d+)(.\d+)?/', '\\1:"\\2\\3"', $json);