ugrás a tartalomhoz

json_decode probléma

DarkHcK · 2014. Feb. 25. (K), 09.45
Sziasztok!
Szeretném a segítségeteket kérni, mert elakadtam.

Van egy ilyenem:
$rawData = file_get_contents('https://www.valami.hu/api/coupon/create', false, $context);

Dumpolva ezt adja:

{"code":"XXXXXX","link":"https:\/\/www.valami.hu\/api\/coupon\/link?state=fe12ca00efd84772d83bd4354d39305d"}


Majd ezt próbálom meg decode -olni, de NULL a visszatérési értéke a json_decode -nak.
A kérdés, hogy miért?

A json_last_error() visszatérése 3, azaz Unexpected control character found
Próbáltam, hogy a $rawData -ra ráeresztek egy stripslashes -t, de nem segített.
Azt is próbáltam, hogy kiszedem a bom -ot így:
$rawData = str_replace("\xEF\xBB\xBF",'',$rawData);
Sajnos ez sem segített.


Van valakinek valami jó ötlete, hogy mi lehet a gond?
 
1

Egy " hátracsúszott, a https

bamegakapa · 2014. Feb. 25. (K), 10.18
Egy " hátracsúszott, a https előtt most nincsen.

Ha ez csak typo, akkor valami van ott, ami nem látszik :). Próbáld dumpolni úgy, előtte ráraksz egy htmlentitiest, hátha HTML-t is küldenek vele, bár nem tudom, miért tennék. Vizsgáld meg a string hosszát, és hasonlítsd össze a tényleges hosszal (amire számítasz).
2

typo és dump

DarkHcK · 2014. Feb. 25. (K), 10.31
Az csak typo. Azt javítom is itt a leírásban. A hosszába tényleg van valami, mert ha bemásolom notepad++ ba, akkor a length: 116, viszont a var_dump azt írja, hogy 124.
3

Megoldás

DarkHcK · 2014. Feb. 25. (K), 10.49
Valami miatt a válasz elé bekerült néhány láthatatlan karakter, amit a trim le tud szedni. A chrome postman írta ki egyedül, s így jöttünk rá.
4

JSON

janoszen · 2014. Feb. 25. (K), 18.12
Ha PHP-ban JSON-t dekodolsz, akkor _mindig_ erdemes hasznalni a json_last_error fuggvenyt hogy megtudd, volt-e hiba a dekodolasban.

A sajat hasznalatu frameworkomben ezt az osztalyt hasznalom JSON muveletekre:

<?php

namespace OGF\JSON;

use OGF\Lang\Object;

/**
 * Utility class to make handling JSON encoding and decoding easier.
 *
 * Encoding:
 * 
 * \OGF\JSON\JSON::encode($yourdata);
 *
 * You may also pass a bitmask of encoding options:
 *
 * \OGF\JSON\JSON::encode(
 *     $yourdata,
 *     \OGF\JSON\JSON::ENCODE_HEX_QUOT
 * );
 *
 * Decoding:
 *
 * \OGF\JSON\JSON::decode($jsonstring);
 *
 * If you want to cast large integers as strings instead of floats, and also pass a depth value:
 *
 * \OGF\JSON\JSON::decode(
 *     $jsonstring,
 *     128,
 *     \OGF\JSON\JSON::DECODE_BIGINT_AS_STRING
 * );
 */
class JSON extends Object {
	/**
	 * All " are converted to \u0022.
	 */
	const ENCODE_HEX_QUOT          = \JSON_HEX_QUOT;

	/**
	 * All < and > are converted to \u003C and \u003E.
	 */
	const ENCODE_HEX_TAG           = \JSON_HEX_TAG;

	/**
	 * All &s are converted to \u0026.
	 */
	const ENCODE_HEX_AMP           = \JSON_HEX_AMP;

	/**
	 * All ' are converted to \u0027.
	 */
	const ENCODE_HEX_APOS          = \JSON_HEX_APOS;

	/**
	 * Encodes numeric strings as numbers.
	 */
	const ENCODE_NUMERIC_CHECK     = \JSON_NUMERIC_CHECK;

	/**
	 * Use whitespace in returned data to format it.
	 */
	const ENCODE_PRETTY_PRINT      = \JSON_PRETTY_PRINT;

	/**
	 * Don't escape /.
	 */
	const ENCODE_UNESCAPED_SLASHES = \JSON_UNESCAPED_SLASHES;

	/**
	 * Outputs an object rather than an array when a non-associative array is used. Especially useful when the recipient
	 * of the output is expecting an object and the array is empty.
	 */
	const ENCODE_FORCE_OBJECT      = \JSON_FORCE_OBJECT;

	/**
	 * Encode multibyte Unicode characters literally (default is to escape as \uXXXX).
	 */
	const ENCODE_UNESCAPED_UNICODE = \JSON_UNESCAPED_UNICODE;

	/**
	 * Encodes large integers as their original string value.
	 */
	const DECODE_BIGINT_AS_STRING  = \JSON_BIGINT_AS_STRING;

	/**
	 * Encodes a PHP variable as a JSON string.
	 *
	 * @see    self::ENCODE_*
	 *
	 * @param  mixed $data
	 * @param  int   $options
	 *
	 * @return string
	 *
	 * @throws JSONSyntaxError
	 * @throws JSONInvalidControlCharacter
	 * @throws JSONInvalidUTF8Error
	 * @throws JSONInvalidError
	 * @throws JSONMaximumStackDepthError
	 */
	public static function encode($data, $options = 0) {
		$string = \json_encode($data, $options);
		switch (\json_last_error()) {
			case JSON_ERROR_DEPTH:
				throw new JSONMaximumStackDepthError($data);
				break;
			case JSON_ERROR_STATE_MISMATCH:
				throw new JSONInvalidError($data);
				break;
			case JSON_ERROR_CTRL_CHAR:
				throw new JSONInvalidControlCharacter($data);
				break;
			case JSON_ERROR_SYNTAX:
				throw new JSONSyntaxError($data);
				break;
			case JSON_ERROR_UTF8:
				throw new JSONInvalidUTF8Error($data);
				break;
		}

		return $string;
	}

	/**
	 * Decodes a string into a PHP array.
	 *
	 * @see    self::DECODE_*
	 *
	 * @param  string $string
	 * @param  int    $depth
	 * @param  int    $options
	 *
	 * @return string
	 *
	 * @throws JSONSyntaxError
	 * @throws JSONInvalidControlCharacter
	 * @throws JSONInvalidUTF8Error
	 * @throws JSONInvalidError
	 * @throws JSONMaximumStackDepthError
	 */
	public static function decode($string, $depth = 512, $options = 0) {
		$data = \json_decode($string, true, $depth, $options);
		switch (\json_last_error()) {
			case JSON_ERROR_DEPTH:
				throw new JSONMaximumStackDepthError($string);
				break;
			case JSON_ERROR_STATE_MISMATCH:
				throw new JSONInvalidError($string);
				break;
			case JSON_ERROR_CTRL_CHAR:
				throw new JSONInvalidControlCharacter($string);
				break;
			case JSON_ERROR_SYNTAX:
				throw new JSONSyntaxError($string);
				break;
			case JSON_ERROR_UTF8:
				throw new JSONInvalidUTF8Error($string);
				break;
		}

		return $data;
	}
}
MIT licenc, yada yada, hasznald egeszseggel.