Доступ к одному из двух значений из файла json [duplicate]

Самый элегантный способ сделать это - сохранить кнопку отправки, но установите ее границу, заполнение и размер шрифта на 0.

Это сделает размеры кнопки 0x0.


Вы можете попробовать это самостоятельно, и, установив контур элемента, вы увидите точку, которая является внешней границей «окружения» элемента 0x0 px.

Нет необходимости в видимости : скрытый, но если он заставляет вас спать по ночам, вы можете бросить его и в миксе.

JS Fiddle

151
задан Paul Crovella 21 March 2017 в 22:30
поделиться

2 ответа

Intro

Сначала у вас есть строка. 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

Или беспорядок с любой из встроенных функций 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

Это происходит потому, что либо:

  1. JSON полностью состоит именно из этого, null.
  2. JSON is недействителен - проверьте результат json_last_error_msg или введите его через JSONLi nt .
  3. Он содержит элементы, вложенные в глубину более 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 .

296
ответ дан Paul Crovella 16 August 2018 в 03:52
поделиться
  • 1
    просто наткнулся на этот ответ и обнаружил, что ссылка на array.include-once.org нарушена. – Jeff 22 September 2017 в 22:47
  • 2
    @Jeff Спасибо. Позор по этому поводу. Я удалил ссылку. – Paul Crovella 22 September 2017 в 23:00
  • 3
    да, учитывая название ссылки и то, как вы ее описали, это звучит как настоящий облом. – Jeff 22 September 2017 в 23:04
  • 4
    Очень хорошее объяснение. Научил меня вещам – GeekWithGlasses 29 September 2017 в 13:43
  • 5
    Yo Dawg, услышал, что вам нравится JSON, поэтому мы поставили JSON в ваш JSON ... – AbraCadaver 4 April 2018 в 20:11

Вы можете использовать json_decode () для преобразования строки json в объект / массив PHP.

Например.

Вход:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Выход:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Несколько точек для запоминания:

  • json_decode требует, чтобы строка была действительной json, иначе она вернется NULL.
  • В случае отказа декодирования json_last_error() можно использовать для определения точного характера ошибки.
  • Сделать убедитесь, что вы перешли в utf8 контент, или json_decode может выйти из строя и просто вернуть значение NULL.
6
ответ дан 9KSoft 16 August 2018 в 03:52
поделиться
  • 1
    Почему есть ответы на этот ответ ?! – candlejack 28 December 2016 в 22:39
  • 2
    Впрочем, им, возможно, не понравилась его простота. Вы всегда можете повышать;) – 9KSoft 29 December 2016 в 04:33
  • 3
    Вероятно, более вероятная причина в том, что он уже был дан ответ, и похоже, что @MohdAbdulMujib после некоторого свободного ответа – Isaac 11 January 2017 в 22:18
  • 4
    @Isaac некоторые люди могут не очень сильно читать все руководство, когда они просто хотят начать с использования функции. В противном случае им было бы лучше читать официальный документ. Весь смысл SO - простота, в которой предоставляются ответы. ИМХО – 9KSoft 12 January 2017 в 03:28
Другие вопросы по тегам:

Похожие вопросы: