1 (edytowany przez wojtula 2016-01-22 21:01:38)

Temat: jshn - parse json package

Hej,
pytanko ws json. W openwrt domyślnie jest pod ręką jshn. Ściągam sobie z internetu pogodę w formacie json. Następnie chcę wyfiltorwać tylko temperaturę oraz wiatr. Całość zrobiłem w ten sposób:

wget "api.openweathermap.org/data/2.5/weather?id=2172797&appid=44db6a862fba0b067b1930da0d769e98"
$pogoda=`cat weather?`
jshn -r "$pogoda"

Wyświetla się:

json_init;
json_add_object 'coord';
json_add_double 'lon' 18.650000;
json_add_double 'lat' 50.300000;
json_close_object;
json_add_array 'weather';
json_add_object '0';
json_add_int 'id' 701;
json_add_string 'main' 'Mist';
json_add_string 'description' 'mist';
json_add_string 'icon' '50n';
json_close_object;
json_close_array;
json_add_string 'base' 'cmc stations';
json_add_object 'main';
json_add_double 'temp' 262.900000;
json_add_int 'pressure' 1033;
json_add_int 'humidity' 92;
json_add_double 'temp_min' 261.150000;
json_add_double 'temp_max' 263.750000;
json_close_object;
json_add_object 'wind';
json_add_double 'speed' 3.100000;
json_add_int 'deg' 140;
json_close_object;
json_add_object 'snow';
json_close_object;
json_add_object 'clouds';
json_add_int 'all' 0;
json_close_object;
json_add_int 'dt' 1453490267;
json_add_object 'sys';
json_add_int 'type' 3;
json_add_int 'id' 5356;
json_add_double 'message' 0.010000;
json_add_string 'country' 'PL';
json_add_int 'sunrise' 1453444351;
json_add_int 'sunset' 1453476124;
json_close_object;
json_add_int 'id' 7530857;
json_add_string 'name' 'Gliwice';
json_add_int 'cod' 200;

Nie wiem jak zrobic, aby przy uzyciu jshn pokazac wartość danej lini np.: dla speed byłaby to wartość: 3.100000

wrt podpowiada: Usage: jshn [-n] -r <message>|-w
Niestety nie rozumiem jak to mogę łatwo wyfiltorwać. Atrybut: |-w  nie działa.

2

Odp: jshn - parse json package

Skrypt w shellu.

#!/bin/sh

. /usr/share/libubox/jshn.sh

O=$(wget "api.openweathermap.org/data/2.5/weather?id=2172797&appid=44db6a862fba0b067b1930da0d769e98" -O -)

json_load "$O"
json_select wind
json_get_var var1 speed
echo "speed: $var1"
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: jshn - parse json package

Napisz sobie skrypt, przykład: https://forum.openwrt.org/viewtopic.php?id=47906

4

Odp: jshn - parse json package

bardzo dziękuję! wszystko śmiga

5

Odp: jshn - parse json package

Nie rozumiem jeszcze jednej rzeczy, mianowicie:
stworzyłem analogicznie skrypt aby pobrać inny parametr: icon, czyli wartość "50n".

Skrypt wygląda tak:

#!/bin/sh

. /usr/share/libubox/jshn.sh

O=$(wget "api.openweathermap.org/data/2.5/weather?id=2172797&appid=44db6a862fba0b067b1930da0d769e98" -O -)

json_load "$O"
json_select "weather"
json_get_var var1 "icon"
echo "ikona: $var1"

Nie zwraca to żadnej wartości. Gdzie robie błąd?

6

Odp: jshn - parse json package

Nigdzie nie robisz błędu. O ile z wind-em miałeś to:
"wind":{"speed":2.1,"deg":230}

tak z weather masz to:
"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02n"}]

ja bym usunął pewne nawiasy i skrypt ruszy z kopyta smile

#!/bin/sh

A=$(wget "api.openweathermap.org/data/2.5/weather?id=2172797&appid=44db6a862fba0b067b1930da0d769e98" -O -)
B=`echo $A | sed 's/\[//g'`
C=`echo $B | sed 's/\]//g'`


. /usr/share/libubox/jshn.sh

json_load "$C"
json_select weather
json_get_var var1 icon
echo "ikona:  $var1"

Może to nie jest zbyt elegancko, ale chyba zwraca to co powinien np... 02n big_smile

Xiaomi AX3000T @ Netgear R6220
* DVBT2 - T230C *

7

Odp: jshn - parse json package

Bo to tablica smile

json_load $(wget....
if json_get_type Status weather && [ "$Status" = array ]; then
   json_select weather
   json_get_type Status 1
   if [ "$Status" = object ]; then
    json_select 1
    json_get_var ICON icon
   fi
fi
echo $ICON
exit 0

Czyli:

json_load $(wget....
json_select weather
json_select 1
json_get_var ICON icon
echo $ICON

Jak nie chcesz typów sprawdzać.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8

Odp: jshn - parse json package

Ponizszy kod nie dziala

#!/bin/sh

. /usr/share/libubox/jshn.sh

O=`$(wget "api.openweathermap.org/data/2.5/weather?id=2172797&appid=44db6a862fba0b067b1930da0d769e98" -O -)`
echo $O

json_load "$O"

json_select weather
json_select 1
json_get_var ICON icon
echo $ICON

9

Odp: jshn - parse json package

Działa, 04n wyświetla.

Tylko zrób

O=$(wget

a nie

O=`$(wget

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10

Odp: jshn - parse json package

Cezary napisał/a:

Działa, 04n wyświetla.

Tylko zrób

O=$(wget

a nie

O=`$(wget

czy mógłbyś mi wytłumaczyć dlaczego w ten sposób?

11

Odp: jshn - parse json package

W przypadków skryptów `...` $(...) to jest tożsame i oznacza wykonanie tego co jest w środku. Połączenie jednego z drugim jest po prostu zbędne - albo używasz jednej składni albo drugiej.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: jshn - parse json package

dziękuję, teraz jest to jasne i śmiga jak nalezy!