Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    249

    Estrapolare valore numerico da stringa contenuto in un oggetto

    Ho un oggetto x contenente 4 stringhe "principali": code, message, headers e body
    codice HTML:
    { "code": 200,
    "message": "OK",
    "headers": {
    "Connection": "close",
    "Content-Length": "124",
    "Content-Type": "application/json"
    ,"Server": "ShellyHTTP/1.0.0"
    },
    "body": {\"id\":0,\"current\":1.565,\"voltage\":233.1,\"act_power\":263.9,\"aprt_power\":366.3,\"pf\":0.77, \"freq\":50.0,\"calibration\":\"factory\"}"
    }
    , aggiungendo ad x una delle "voci" principali, ad esempio x.body ottengo la stringa
    codice:
    {"id":0,"current":1.705,"voltage":235.8,"act_power":335.6,"aprt_power":403.6,"pf":0.88, "freq":50.0,"calibration":"factory"}
    da cui vorrei ricavare il valore numerico di act_power, come posso fare?

    Ps Ho già provato x.body.act_power, x.body.{"act_power"}, x.body."{act_power"}, x.body.{act_power} ma nulla...
    Ultima modifica di mapa3n; 25-11-2023 a 22:08

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    In JavaScript puoi accedere alle proprietà di un oggetto usando la sintassi a punti oppure quella a parentesi quadre.

    codice:
    x.body.act_power;
    ...
    x.body["act_power"];
    A parte la tua prima prova, le altre non hanno una sintassi valida.
    In questo caso le graffe servono solo per definire l'oggetto, non per accedere alle sue proprietà.

    Se non riesci ad accedere in quel modo allora potrebbe esserci qualche altro problema, ma bisogna capire il contesto.
    Ultima modifica di KillerWorm; 25-11-2023 a 22:14
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Crea un Array splittando la virgola e poi cerchi l'array che ti interessa, già sapendo che il valore è dopo i due punti, splitti nuovamente per i due punti. L' Array 1 è il tuo valore

    Prima della splittare ti consiglio di eliminare le graffe e tutti i doppi apici.
    Ultima modifica di SoloWiFi; 26-11-2023 a 08:25
    Io nella vita ho visto cose che voi astemi neanche potete immaginare.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    249
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    In JavaScript puoi accedere alle proprietà di un oggetto usando la sintassi a punti oppure quella a parentesi quadre.

    codice:
    x.body.act_power;
    ...
    x.body["act_power"];
    A parte la tua prima prova, le altre non hanno una sintassi valida.
    In questo caso le graffe servono solo per definire l'oggetto, non per accedere alle sue proprietà.

    Se non riesci ad accedere in quel modo allora potrebbe esserci qualche altro problema, ma bisogna capire il contesto.
    …ho provato sia con x.body.act_power, e viene restituito undefined, che con x.body[“act_power”], e viene restituito l’errore Uncaught Error: Field or method "act_power" does not already exist, and can't create it on String, qualche idea?
    Ultima modifica di mapa3n; 26-11-2023 a 20:41

  5. #5
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Quote Originariamente inviata da mapa3n
    can't create it on String
    Hai parlato di stringa ma non mi era tanto chiaro che l'oggetto in sé fosse una stringa.

    Deduco si tratti appunto di una stringa JSON; cioè una rappresentazione testuale di un oggetto JavaScript, ma questo non lo hai indicato, quindi mi ha confuso il fatto che tu stesso stavi provando ad accedere direttamente alle sue proprietà come se avessi già un oggetto disponibile.

    Non mi è comunque chiaro se l'intero oggetto x sia un JSON oppure se lo siano solo le sue proprietà, tra cui body a cui stai cercando di accedere.
    Anche se lo hai accennato ho interpretato male le tue indicazioni perché fatico a capire quale sia il reale scenario, per questo ho scritto che andava chiarito meglio il contesto, ma (perdona la franchezza) vedo che non ti presti a troppi dettagli.

    Ti do giusto un consiglio: vedi il metodo JSON.parse(), dovresti usarlo in qualche modo per convertire la tua stringa JSON in un reale oggetto, prima di poter accedere alle sue proprietà via JavaScript.
    Il mio aiuto termina qua.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    249
    ...ho fatto come mi hai consigliato e ho utilizzato il metodo JSON.Parse() per passare ad una variabile di appoggio di tipo oggetto x.body:

    codice:
    phaseAOfOtherEM = JSON.parse(x.body);
    ; ho poi utilizzato la notazione a punti per accedere al valore di act_power:
    codice:
    print("Phase A other EM: W " + phaseAOfOtherEM.act_power);
    Grazie per il consiglio, prezioso!

    Altra domanda (e spero l'ultima), perché così funziona
    codice:
    function startMonitorOtherEM() {  let phaseAOfOtherEM = null;
      let phaseBOfOtherEM = null;
      let totalPhaseOfOtherEM = null;
      let ip = "192.168.178.170";
      
      Timer.set(10000, true, function status() {
        Shelly.call("HTTP.GET", {"url":"http://" + ip + "/rpc/EM1.GetStatus?id=0"}, function(result, error_code, error_msg, ud) {
        phaseAOfOtherEM = JSON.parse(result.body);
        print("Phase A of other EM: W " + phaseAOfOtherEM.act_power);
        })
        Shelly.call("HTTP.GET", {"url":"http://" + ip + "/rpc/EM1.GetStatus?id=1"}, function(result, error_code, error_msg, ud) {
        phaseBOfOtherEM = JSON.parse(result.body);
        print("Phase B of other EM: W " + phaseBOfOtherEM.act_power);
        totalPhaseOfOtherEM = (phaseBOfOtherEM.act_power) + (phaseBOfOtherEM.act_power);
        print("Total phase of other EM: W " + totalPhaseOfOtherEM);
        })
      })
    }
    
    
    startMonitorOtherEM();
    mentre così
    codice:
    function startMonitorOtherEM() {  let phaseAOfOtherEM = null;
      let phaseBOfOtherEM = null;
      let totalPhaseOfOtherEM = null;
      let ip = "192.168.178.170";
      
      Timer.set(10000, true, function status() {
        Shelly.call("HTTP.GET", {"url":"http://" + ip + "/rpc/EM1.GetStatus?id=0"}, function(result, error_code, error_msg, ud) {
        phaseAOfOtherEM = JSON.parse(result.body);
        print("Phase A of other EM: W " + phaseAOfOtherEM.act_power);
        })
        Shelly.call("HTTP.GET", {"url":"http://" + ip + "/rpc/EM1.GetStatus?id=1"}, function(result, error_code, error_msg, ud) {
        phaseBOfOtherEM = JSON.parse(result.body);
        print("Phase B of other EM: W " + phaseBOfOtherEM.act_power);
        })
        totalPhaseOfOtherEM = (phaseBOfOtherEM.act_power) + (phaseBOfOtherEM.act_power);
        print("Total phase of other EM: W " + totalPhaseOfOtherEM);
      })
    }
    
    
    startMonitorOtherEM();
    ricevo l'errore [COLOR=var(--secondary)]Uncaught Error: Cannot read property 'act_power' of null [/COLOR][COLOR=var(--secondary)]at ...fOtherEM = (phaseBOfOtherEM.act_power) + (phaseBOfOtherEM.ac...[/COLOR][COLOR=var(--secondary)]^[/COLOR][COLOR=var(--secondary)]in function called from system?[/COLOR][COLOR=var(--secondary)]
    [/COLOR]
    Ultima modifica di mapa3n; 02-12-2023 a 14:08

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    La funzione di callback definita per Shelly.call() viene eseguita in modo asincrono, cioè quando la chiamata è terminata e quindi si riceve una risposta.

    La variabile phaseBOfOtherEM è definita inizialmente come null ed è poi popolata dentro quella funzione.

    Stai cercando di accedere alla proprietà act_power che viene vista nel primo caso perché esegui quella riga dopo che hai popolato la variabile in questione (cioè dentro la funzione di callback).
    Viceversa, nel secondo caso, quella variabile è ancora null nel punto in cui la stai interpellando (fuori dalla funzione), perché la funzione di callback, essendo asincrona, non è stata ancora eseguita in quel determinato momento.

    L'errore infatti ti dice che non è possibile leggere quella specifica proprietà di "un oggetto" null.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.