Сначала у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON - текстовый формат сериализации - так что причудливая строка, но все же просто строка. Декодируйте его в PHP с помощью json_decode()
.
$data = json_decode($json);
В нем вы можете найти:
Это то, что может быть закодировано в JSON. Или, точнее, это версии PHP, которые могут быть закодированы в JSON.
В них нет ничего особенного. Они не являются объектами JSON или массивами JSON. Вы расшифровали JSON - теперь у вас есть основные повседневные типы PHP .
Объекты будут экземплярами stdClass , встроенным классом, который просто generic thing , что здесь не важно.
Вы получаете доступ к свойствам одного из этих объектов так же, как и для публичных нестатических свойств любого другого объекта, например $object->property
.
$json = '
{
"type": "donut",
"name": "Cake"
}';
$yummy = json_decode($json);
echo $yummy->type; //donut
Доступ к элементам одного из этих массивов осуществляется так же, как и для любого другой массив, например $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Итерации над ним с помощью foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Глазурованный Шоколад с спринклерами Maple
blockquote>Или беспорядок с любой из встроенных функций bazillion [].
Доступ к вложенные элементы
Свойства объектов и элементов массивов могут быть больше объектов и / или массивов - вы можете просто продолжать доступ к своим свойствам и членам как обычно, например
$object->array[0]->etc
.$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); echo $yummy->toppings[2]->id; //5004
Передача
true
в качестве второго аргумента в json_decode ()Когда вы это сделаете, вместо объектов вы получите ассоциативные массивы - массивы со строками для ключей. Снова вы получаете доступ к их элементам, как обычно, например.
$array['key']
.$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json, true); echo $yummy['toppings'][2]['type']; //Maple
Не знаю, как структурированы данные
Прочитайте документацию, независимо от того, получение JSON из.
Посмотрите на JSON - где вы видите фигурные скобки
{}
, ожидайте объект, где вы видите квадратные скобки[]
, ожидаете массив.Нажмите декодированные данные с помощью
print_r()
:$json = ' { "type": "donut", "name": "Cake", "toppings": [ { "id": "5002", "type": "Glazed" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5004", "type": "Maple" } ] }'; $yummy = json_decode($json); print_r($yummy);
и проверьте вывод:
stdClass Object ( [type] => donut [name] => Cake [toppings] => Array ( [0] => stdClass Object ( [id] => 5002 [type] => Glazed ) [1] => stdClass Object ( [id] => 5006 [type] => Chocolate with Sprinkles ) [2] => stdClass Object ( [id] => 5004 [type] => Maple ) ) )
Он расскажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.
Если вы можете только дойти до него до того, как потеряетесь, зайдите так далеко и нажмите , что с
print_r()
:print_r($yummy->toppings[0]);
stdClass Object ( [id] => 5002 [type] => Glazed )
Разбить проблему на части, которые легче обернуть вокруг головы.
json_decode()
возвращаетnull
Это происходит потому, что либо:
- JSON полностью состоит именно из этого,
null
.- JSON is недействителен - проверьте результат
json_last_error_msg
или введите его через JSONLi nt .- Он содержит элементы, вложенные в глубину более 512 уровней. Эта максимальная глубина по умолчанию может быть переопределена путем передачи целого числа в качестве третьего аргумента в
json_decode()
.Если вам нужно изменить максимальную глубину, вы, вероятно, решение неправильной проблемы. Узнайте, почему вы получаете такие глубоко вложенные данные (например, у службы, к которой вы обращаетесь, у которой возникает JSON, есть ошибка) и получить это, чтобы этого не произошло.
Имя свойства объекта содержит специальный символ
Иногда у вас будет имя свойства объекта, которое содержит нечто вроде дефиса
-
или знака@
, которое не может использоваться в литеральном идентификаторе. Вместо этого вы можете использовать строковый литерал в фигурных скобках для его адресации.$json = '{"@attributes":{"answer":42}}'; $thing = json_decode($json); echo $thing->{'@attributes'}->answer; //42
Если у вас есть свойство integer as: Как получить доступ к свойствам объекта с именами типа целых чисел? как ссылка.
Кто-то поставил JSON в ваш JSON
Это смешно, но это происходит - JSON закодирован как строка в вашем JSON. Декодирование, доступ к строке как обычно, декодирование , которое , и, в конечном счете, доступ к тому, что вам нужно.
$json = ' { "type": "donut", "name": "Cake", "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]" }'; $yummy = json_decode($json); $toppings = json_decode($yummy->toppings); echo $toppings[0]->type; //Glazed
Данные не помещаются в память
Если ваш JSON слишком большой для
json_decode()
, чтобы обрабатывать сразу, все начинает становиться сложным. См. Также:Как отсортировать его
См.: Ссылка: все основные способы сортировки массивов и данных в PHP .
Элемент SVG <circle>
не отображает текст, который вы размещаете внутри него, используя функцию .text
. Способ отображения текста состоял бы в том, чтобы сделать узлы графа элементов SVG <g>
. Затем они могут содержать дочерние элементы <circle>
и <text>
.
Это может выглядеть так:
\\create graph nodes using groups
var node = svg.selectAll(".node")
.data(graph.nodes)
.enter().append("g").call(force.drag);
node.append("circle")
.attr("class", "node")
.attr("r", 5)
.style("fill", function (d) { return color(d.group); });
node.append("text")
.text(function (d) { return d.name; });
Вам также нужно будет изменить силу так, чтобы она преобразует группу <g>
на галочку.
force.on("tick", function () {
...
node.attr("transform", function (d) { return "translate(" + d.x + "," + d.y + ")"; });
});
Вы можете увидеть ее в действии для небольшого графика в http://jsfiddle.net/vrWDc/19/ , Этот метод может быть не очень эффективным при применении к большому графику из-за количества текста, который нужно визуализировать.