Aller au contenu

Extraction des données d'une chaîne


Sujets conseillés

Posté

Bonjour,
j'ai un plugin de géolocalisation qui envoi des données au serveur les données sont envoyés sous cette forme:

$values = '{
    "location": {
        "coords": {
            "latitude":   [Float],
            "longitude":  [Float]
            "accuracy":   [Float]
            "speed":      [Float|-1],
            "heading":    [Float/0-360|-1],
            "altitude":   [Float]
        },
        "extras": {   // <-- optional extras.  @see #getCurrentPosition for details
            "foo": "bar"
        },
        "activity": {
            "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown],
            "confidence": [Int/0-100%]
        },
        "geofence": {  // <-- Present only if a geofence was triggered at this location
            "identifier": [String],
            "action": [String ENTER|EXIT]            
        },
        "battery": {
            "level": [Float/0-1],
            "is_charging": [Boolean]
        },
        "timestamp": [ISO-8601 UTC], // eg:  "2015-05-05T04:31:54.123Z"
        "uuid":      [String],       // <-- Universally unique identifier
        "event"      [String],       // <-- motionchange|geofence|heartbeat
        "is_moving": [Boolean],      // <-- The motion-state when location was recorded (@deprecated; use #event)
        "is_heartbeat: [Boolean],    // <-- If this location was recorded during heartbeat mode.
        "odometer": [Float/meters]
    }
}';

Pour le traitement j'utilise :

$retour = json_decode($values,true);
$speed = $retour['location']['coords']['speed'];
$longitude = $retour['location']['coords']['longitude'];
etc...

 

Mais dans certains cas "location" est un tableau, ce qui donne

$values = '{
    "location": [{
        "coords": {
            "latitude":   [Float],
            "longitude":  [Float]
            "accuracy":   [Float]
            "speed":      [Float|-1],
            "heading":    [Float/0-360|-1],
            "altitude":   [Float]
        },
        "extras": {   // <-- optional extras.  @see #getCurrentPosition for details
            "foo": "bar"
        },
        "activity": {
            "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown],
            "confidence": [Int/0-100%]
        },
        "geofence": {  // <-- Present only if a geofence was triggered at this location
            "identifier": [String],
            "action": [String ENTER|EXIT]            
        },
        "battery": {
            "level": [Float/0-1],
            "is_charging": [Boolean]
        },
        "timestamp": [ISO-8601 UTC], // eg:  "2015-05-05T04:31:54.123Z"
        "uuid":      [String],       // <-- Universally unique identifier
        "event"      [String],       // <-- motionchange|geofence|heartbeat
        "is_moving": [Boolean],      // <-- The motion-state when location was recorded (@deprecated; use #event)
        "is_heartbeat: [Boolean],    // <-- If this location was recorded during heartbeat mode.
        "odometer": [Float/meters]
    },
    {
        "coords": {
            "latitude":   [Float],
            "longitude":  [Float]
            "accuracy":   [Float]
            "speed":      [Float|-1],
            "heading":    [Float/0-360|-1],
            "altitude":   [Float]
        },
        "extras": {   // <-- optional extras.  @see #getCurrentPosition for details
            "foo": "bar"
        },
        "activity": {
            "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown],
            "confidence": [Int/0-100%]
        },
        "geofence": {  // <-- Present only if a geofence was triggered at this location
            "identifier": [String],
            "action": [String ENTER|EXIT]            
        },
        "battery": {
            "level": [Float/0-1],
            "is_charging": [Boolean]
        },
        "timestamp": [ISO-8601 UTC], // eg:  "2015-05-05T04:31:54.123Z"
        "uuid":      [String],       // <-- Universally unique identifier
        "event"      [String],       // <-- motionchange|geofence|heartbeat
        "is_moving": [Boolean],      // <-- The motion-state when location was recorded (@deprecated; use #event)
        "is_heartbeat: [Boolean],    // <-- If this location was recorded during heartbeat mode.
        "odometer": [Float/meters]
    } etc...]
}';

Auriez vous une idée de comment récupérer les données ?

 

Merci d'avance

Posté

Bonjour, 

 

Quelles données exactement souhaitez vous récupérer? Toutes ? 

 

J'ai remarqué que vous le convertissez en array, pourquoi ne pas utiliser une méthode telle que count pour savoir si location contient un seul ou plusieurs objets ? Ou éventuellement, vérifier avec une méthode d'array si une des clés sensée ne pas s'y trouver existe dans le nœud de location. 

 

 

Posté

Bonjour,

oui j'aimerai pouvoir récupérer toutes les données.

 

Je convertit en array car après avoir bien galéré c'est le seul moyen que j'ai trouvé pour y arriver :(
Quand je fais un count($retour) dans tous les cas j'obtient 1.

 

Dans le cas ou location est un tableau rien ne fonctionne la fonction json_decode me renvoi null.

Posté (modifié)

Salut,

A priori, vu la structure de la réponse on devrait avoir :

 

$retour = json_decode($values,true);
var_dump($retour) => sdtclass object

Et à partir de là :

if (!is_array($retour->location)){ // si la propriété location de retour n'est pas un tableau
	$speed = $retour->location->coords->speed;
	var_dump($speed) => float;
} else {
	for ($i=0 ; $i<count($retour->location) ; $i++){
      	$speed = $retour->location[$i]->coords->speed;
      	var_dump($speed) => float;
	}
}

Je trouve curieux que tu récupères un array et pas un objet... Peut être ton json_decode qui fait mal le boulot ( paramètre true ) ?

 

Edit : effectivement d'apres la doc php c'est le true qui renvoie un tableau associatif... Fais donc plutot :

 

$retour = json_decode($values);
var_dump($retour) => stdclass object

Et tu pourras utiliser mon code tel quel.

Modifié par BlackPage
Posté

Merci de m'aider mais dans les 2 cas j'obtient null (j'avais déja testé pour voir si $values['location'] retournait un tableau).

$retour = json_decode($values,true);
var_dump($retour);
$retour = json_decode($values);
var_dump($retour);

Voici un exemple de ma variable $values si jamais et la manière dont je la récupère

$values = file_get_contents('php://input');
//si je fait un echo $values j'obtient ça
{"location":[{"coords":{"speed":13.78999996185303,"longitude":6.106461001741759,"latitude":46.20269310378117,"accuracy":10,"heading":239.3082580566406,"altitude":424.451416015625,"altitudeAccuracy":6},"is_heartbeat":false,"extras":{"action":""},"is_moving":true,"odometer":1763.193420100596,"uuid":"4C420566-1F55-4A89-83DA-F03D5C9E2423","activity":{"type":"unknown","confidence":100},"battery":{"level":0.28,"is_charging":false},"timestamp":"2016-10-19T09:13:12.000Z"},{"coords":{"speed":12.67000007629395,"longitude":6.105477869875073,"latitude":46.20219555439851,"accuracy":10,"heading":217.1203918457031,"altitude":424.525390625,"altitudeAccuracy":6},"is_heartbeat":false,"extras":{"action":""},"is_moving":true,"odometer":1857.093282904583,"uuid":"603BD74E-7324-4C17-B21A-E16C7430BC3D","activity":{"type":"unknown","confidence":100},"battery":{"level":0.28,"is_charging":false},"timestamp":"2016-10-19T09:13:19.000Z"}]}

 
 

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...