Я хочу сделать следующее:
это m получить на php от get api эту строку json, которую я хочу передать json, но она не преобразуется в массив
echo $str='{ action : "create", record: { type: "n$product", fields: { n$name: "Bread", n$price: 2.11 }, namespaces: { "my.demo": "n" } } }'; $json = json_decode($str, true);
приведенный выше код не возвращает мне массив.
Если вы передадите JSON в свой пост в json_decode
, он будет терпеть неудачу. Действительные строки JSON имеют цитируемые ключи:
json_decode('{foo:"bar"}'); // this fails json_decode('{"foo":"bar"}', true); // returns array("foo" => "bar") json_decode('{"foo":"bar"}'); // returns an object, not an array.
Попробуй это:
$data = json_decode($your_json_string, TRUE);
второй параметр сделает декодированную строку json в ассоциативные массивы.
Если вы получаете строку JSON из формы с помощью $_REQUEST
, $_GET
или $_POST
вам нужно будет использовать функцию html_entity_decode()
. Я не понимал этого до тех пор, пока не var_dump
того, что было в запросе, и что я скопировал и var_dump
echo
и заметил, что строка запроса была намного больше.
Правильный способ:
$jsonText = $_REQUEST['myJSON']; $decodedText = html_entity_decode($jsonText); $myArray = json_decode($decodedText, true);
С ошибками:
$jsonText = $_REQUEST['myJSON']; $myArray = json_decode($jsonText, true); echo json_last_error(); //Returns 4 - Syntax error;
Используйте json_decode($json_string, TRUE)
для преобразования объекта JSON в массив.
Пример:
$json_string = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; $my_array_data = json_decode($json_string, TRUE);
ПРИМЕЧАНИЕ. Второй параметр преобразует декодированную строку JSON в ассоциативный массив.
===========
Вывод:
var_dump($my_array_data); array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
Если вы получаете строку json из URL с помощью file_get_contents
, выполните следующие действия:
$url = "http://localhost/rest/users"; //The url from where you are getting the contents $response = (file_get_contents($url)); //Converting in json string $n = strpos($response, "["); $response = substr_replace($response,"",0,$n+1); $response = substr_replace($response, "" , -1,1); print_r(json_decode($response,true));
ваша строка должна быть в следующем формате:
$str = '{"action": "create","record": {"type": "n$product","fields": {"n$name": "Bread","n$price": 2.11},"namespaces": { "my.demo": "n" }}}'; $array = json_decode($str, true); echo "<pre>"; print_r($array);
Вывод:
Array ( [action] => create [record] => Array ( [type] => n$product [fields] => Array ( [n$name] => Bread [n$price] => 2.11 ) [namespaces] => Array ( [my.demo] => n ) ) )
Если вам когда-либо понадобится преобразовать JSON-файл или структуры в массивы в стиле PHP, со всеми уровнями вложенности вы можете использовать эту функцию. Во-первых, вы должны json_decode ($ yourJSONdata), а затем передать его этой функции. Он выведет в окно браузера (или консоль) правильные массивы в стиле PHP.
<?php $str='{ "action" : "create", "record" : { "type": "$product", "fields": { "name": "Bread", "price": "2.11" }, "namespaces": { "my.demo": "n" } } }'; echo $str; echo "<br>"; $jsonstr = json_decode($str, true); print_r($jsonstr); ?>
Я думаю, что это должно работать, а именно, что ключи также должны быть в двойных кавычках, если они не являются числами.
если вы хотите преобразовать свой массив в json и наоборот, можете попробовать http://framework.zend.com/manual/en/zend.json.basics.html
просто используйте класс zend_json
, у него много приятных функций.
Используйте этот конвертер, он не терпит неудачу: Services_Json
// create a new instance of Services_JSON $json = new Services_JSON(); // convert a complexe value to JSON notation, and send it to the browser $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); $output = $json->encode($value); print($output); // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] // accept incoming POST data, assumed to be in JSON notation $input = file_get_contents('php://input', 1000000); $value = $json->decode($input); // if you want to convert json to php arrays: $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
это мое решение: json string $columns_validation = string(1736) "[{"colId":"N_ni","hide":true,"aggFunc":null,"width":136,"pivotIndex":null,"pinned":null,"rowGroupIndex":null},{"colId":"J_2_fait","hide":true,"aggFunc":null,"width":67,"pivotIndex":null,"pinned":null,"rowGroupIndex":null}]"
поэтому я использую json_decode дважды:
$js_column_validation = json_decode($columns_validation); $js_column_validation = json_decode($js_column_validation); var_dump($js_column_validation);
и результат:
array(15) { [0]=> object(stdClass)#23 (7) { ["colId"]=> string(4) "N_ni" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(136) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL } [1]=> object(stdClass)#2130 (7) { ["colId"]=> string(8) "J_2_fait" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(67) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL }