0

ホーム オートメーション システムからの JSON 応答を JavaScript で解析しようとしています。レスポンスは こちら

これは応答のほんの一部です。また、理由はわかりませんが、再起動するたびにキーの順序が変わります。su 番号インデックスを使用しても実際には機能しません。sensor.out の状態値を保存できる必要があります。 、sensor.in、sensor.door を andorid の tasker の変数に入力します。entity.id を使用して選択しようとしましたが、何らかの理由でコードが終了しませんでした (自分が何をしているのかわからなかったと思います)。

4

3 に答える 3

0

誰もが言うことは正しいです。応答のキーの順序は重要ではありません。数値インデックスではなく、(文字列) キーを使用します。

var arr = [
  {
    "entity_id":"sensor.door",
    "state":"closed"
  }];   // other attributes chopped out for brevity

var entity_id_interested_in = 'sensor.door';
var state = '[entity_id not found in response]';
for (var i = 0; i < arr.length; i++) {

    console.log(arr[i].entity_id + ' state:' + arr[i].state);
    if (arr[i].entity_id == entity_id_interested_in)
    {
       state = arr[i].state;
       break;
    }
}
console.log (state);
于 2016-12-31T12:28:19.667 に答える
0

インデックスを使用してオブジェクトからプロパティを選択しようとしている場合は、非常に具体的な理由がない限り、そうすべきではありません。

幸いなことに、順序を知る必要はありません。JSON 配列から 2 つのオブジェクトを取得し、プロパティをスクランブルして、指定したキー/値を含む任意のオブジェクトを返す関数を作成しました。

あなたの質問は理解するのが少し難しいですが、これでアイデアが得られると思います。

<script type="text/javascript">
let arr = [
  {
    "attributes":{
      "friendly_name":"door"
    },
    "entity_id":"sensor.frontdoor",
    "last_changed":"2016-12-31T11:15:59.395808+00:00",
    "last_updated":"2016-12-31T11:15:59.395808+00:00",
    "state":"closed"
  },
  {
    "last_changed":"2016-12-31T11:15:59.395808+00:00",
    "state":"closed",
    "attributes":{
      "friendly_name":"door"
    },
    "entity_id":"sensor.backdoor",
    "last_updated":"2016-12-31T11:15:59.395808+00:00"
  }
];

function findKey ( theKey, theVal ) {
  let reduced = arr.filter ( d => {
    return d [ theKey ] === theVal;
  });

  return reduced;
}

let targets = findKey ( 'entity_id', 'sensor.backdoor' );
targets.forEach ( d => {
   // This check is a little naive, but should give you the idea
   if ( 'state' in d ) {
      console.log ( d.state );
   }
} );
</script>
于 2016-12-31T12:03:42.480 に答える