Сначала у вас есть строка. 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 .
Теперь я вижу проблему. Вы используете connect для компонента, который является родительским для компонента Provider .
Вам нужно создать новый компонент под названием Main и использовать connect для этого. Ваш компонент App не может использовать connect, поскольку он не является дочерним элементом поставщика , а является его родителем.
Или другими словами:
App.js
import React from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import reducers from './app/src/reducers';
import ReduxThunk from 'redux-thunk';
...
const store = createStore(reducers, {}, applyMiddleware(ReduxThunk));
class App extends React.Component {
render() {
return (
<Provider store={store}>
<Main />
</Provider>
);
}
}
export default App;
Main.js
import React from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import { connect } from 'react-redux';
import { firebase } from './config/config';
import { getUserProfile } from './app/src/actions/index';
...
const AppContainer = createAppContainer(MainStack);
class Main extends React.Component {
constructor(props) {
super(props);
}
componentDidMount = () => {
var that = this;
firebase.auth().onAuthStateChanged(async function(user) {
if (user) {
await that.getUserProfile(user.uid);
} else {
that.navigation.navigate('Auth');
}
})
}
render() {
return (
<AppContainer />
);
}
}
const mapStateToProps = state => {
return {
user: state.auth.user
}
}
export default connect(mapStateToProps, {getUserProfile})(Main);